diff --git a/.changeset/README.md b/.changeset/README.md
index e5b6d8d6a..4f3b76b09 100644
--- a/.changeset/README.md
+++ b/.changeset/README.md
@@ -5,4 +5,4 @@ with multi-package repos, or single-package repos to help you version and publis
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
We have a quick list of common questions to get you started engaging with this project in
-[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
+[our documentation](https://github.com/changesets/changesets/blob/master/docs/common-questions.md)
diff --git a/.changeset/bright-pots-hope.md b/.changeset/bright-pots-hope.md
new file mode 100644
index 000000000..6bd9a887c
--- /dev/null
+++ b/.changeset/bright-pots-hope.md
@@ -0,0 +1,18 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+Beta release with dapp connector fixes
diff --git a/.changeset/crisp-zoos-retire.md b/.changeset/crisp-zoos-retire.md
new file mode 100644
index 000000000..84fd2a25c
--- /dev/null
+++ b/.changeset/crisp-zoos-retire.md
@@ -0,0 +1,18 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+dapp-client updates
diff --git a/.changeset/cyan-radios-relax.md b/.changeset/cyan-radios-relax.md
new file mode 100644
index 000000000..ec408d6cd
--- /dev/null
+++ b/.changeset/cyan-radios-relax.md
@@ -0,0 +1,18 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+Fix signer 404 error, minor fixes
diff --git a/.changeset/free-tips-switch.md b/.changeset/free-tips-switch.md
new file mode 100644
index 000000000..0921b6d35
--- /dev/null
+++ b/.changeset/free-tips-switch.md
@@ -0,0 +1,18 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+3.0.0 beta
diff --git a/.changeset/goofy-laws-serve.md b/.changeset/goofy-laws-serve.md
new file mode 100644
index 000000000..690a5f76b
--- /dev/null
+++ b/.changeset/goofy-laws-serve.md
@@ -0,0 +1,21 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+'@repo/eslint-config': patch
+'@repo/typescript-config': patch
+'@repo/ui': patch
+---
+
+Beta release for v3
diff --git a/.changeset/new-turkeys-double.md b/.changeset/new-turkeys-double.md
new file mode 100644
index 000000000..72f26beb9
--- /dev/null
+++ b/.changeset/new-turkeys-double.md
@@ -0,0 +1,18 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+Apple auth fixes
diff --git a/.changeset/nice-tips-slide.md b/.changeset/nice-tips-slide.md
new file mode 100644
index 000000000..1595123e7
--- /dev/null
+++ b/.changeset/nice-tips-slide.md
@@ -0,0 +1,18 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+Apple auth fix
diff --git a/.changeset/open-toes-marry.md b/.changeset/open-toes-marry.md
new file mode 100644
index 000000000..ec5bf3217
--- /dev/null
+++ b/.changeset/open-toes-marry.md
@@ -0,0 +1,20 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+'@repo/eslint-config': patch
+'@repo/typescript-config': patch
+'@repo/ui': patch
+---
+
+3.0.0-beta.3 with fixes
diff --git a/.changeset/plain-feet-stare.md b/.changeset/plain-feet-stare.md
new file mode 100644
index 000000000..c99c82026
--- /dev/null
+++ b/.changeset/plain-feet-stare.md
@@ -0,0 +1,17 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+3.0.0-beta.2 with identity instrument updates
diff --git a/.changeset/pre.json b/.changeset/pre.json
new file mode 100644
index 000000000..3b0804872
--- /dev/null
+++ b/.changeset/pre.json
@@ -0,0 +1,39 @@
+{
+ "mode": "exit",
+ "tag": "beta",
+ "initialVersions": {
+ "docs": "0.1.0",
+ "web": "0.1.0",
+ "@0xsequence/api": "3.0.0-beta.11",
+ "@0xsequence/builder": "3.0.0-beta.11",
+ "@0xsequence/guard": "3.0.0-beta.11",
+ "@0xsequence/identity-instrument": "3.0.0-beta.11",
+ "@0xsequence/indexer": "3.0.0-beta.11",
+ "@0xsequence/marketplace": "3.0.0-beta.11",
+ "@0xsequence/metadata": "3.0.0-beta.11",
+ "@0xsequence/relayer": "3.0.0-beta.11",
+ "@0xsequence/userdata": "3.0.0-beta.11",
+ "@0xsequence/abi": "3.0.0-beta.11",
+ "@0xsequence/wallet-core": "3.0.0-beta.11",
+ "@0xsequence/dapp-client": "3.0.0-beta.11",
+ "@0xsequence/wallet-primitives": "3.0.0-beta.11",
+ "@0xsequence/wallet-wdk": "3.0.0-beta.11",
+ "@repo/eslint-config": "0.0.1-beta.1",
+ "@repo/typescript-config": "0.0.1-beta.1",
+ "@repo/ui": "0.0.1-beta.1"
+ },
+ "changesets": [
+ "bright-pots-hope",
+ "crisp-zoos-retire",
+ "cyan-radios-relax",
+ "free-tips-switch",
+ "goofy-laws-serve",
+ "new-turkeys-double",
+ "nice-tips-slide",
+ "open-toes-marry",
+ "plain-feet-stare",
+ "tiny-files-chew",
+ "wild-feet-carry",
+ "wise-heads-buy"
+ ]
+}
diff --git a/.changeset/tiny-files-chew.md b/.changeset/tiny-files-chew.md
new file mode 100644
index 000000000..672546fd0
--- /dev/null
+++ b/.changeset/tiny-files-chew.md
@@ -0,0 +1,18 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+dapp client updates for EOA login
diff --git a/.changeset/wild-feet-carry.md b/.changeset/wild-feet-carry.md
new file mode 100644
index 000000000..962942831
--- /dev/null
+++ b/.changeset/wild-feet-carry.md
@@ -0,0 +1,17 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+3.0.0-beta.1
diff --git a/.changeset/wise-heads-buy.md b/.changeset/wise-heads-buy.md
new file mode 100644
index 000000000..1c35a4d35
--- /dev/null
+++ b/.changeset/wise-heads-buy.md
@@ -0,0 +1,17 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+RC5 upgrade
diff --git a/.codesandbox/.github/workflows/build.yml b/.codesandbox/.github/workflows/build.yml
new file mode 100644
index 000000000..86518b55b
--- /dev/null
+++ b/.codesandbox/.github/workflows/build.yml
@@ -0,0 +1,32 @@
+name: build dapp
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ name: Build and Push
+ steps:
+ - name: git-checkout
+ uses: actions/checkout@v3
+
+ - name: Setup PNPM
+ uses: pnpm/action-setup@v2
+ with:
+ version: 8
+ run_install: true
+
+ - name: Build
+ run: pnpm dist
+
+ - name: Push
+ uses: s0/git-publish-subdir-action@develop
+ env:
+ REPO: self
+ BRANCH: build
+ FOLDER: dist
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ MESSAGE: 'Build: ({sha}) {msg}'
diff --git a/.codesandbox/.gitignore b/.codesandbox/.gitignore
new file mode 100644
index 000000000..e4db0232c
--- /dev/null
+++ b/.codesandbox/.gitignore
@@ -0,0 +1,19 @@
+.env
+
+#dependencies
+node_modules/
+
+# production
+dist/
+
+# misc
+.DS_Store
+.vscode
+.idea/
+*.iml
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+.env.local
diff --git a/.codesandbox/.prettierrc b/.codesandbox/.prettierrc
new file mode 100644
index 000000000..421afa979
--- /dev/null
+++ b/.codesandbox/.prettierrc
@@ -0,0 +1,9 @@
+{
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "arrowParens": "avoid",
+ "printWidth": 130
+}
diff --git a/.codesandbox/README.md b/.codesandbox/README.md
new file mode 100644
index 000000000..dd2d3cbf3
--- /dev/null
+++ b/.codesandbox/README.md
@@ -0,0 +1,49 @@
+Demo Dapp
+=========
+
+Dapp example on how to use Sequence Wallet. Covers how to connect, sign messages and send transctions.
+
+Try this dapp at: [https://0xsequence.github.io/demo-dapp](https://0xsequence.github.io/demo-dapp)
+
+For complete documentation on Sequence, please see: [https://docs.sequence.build](https://docs.sequence.build)
+
+## Usage
+
+1. pnpm install
+2. pnpm start
+3. Open browser to http://localhost:4000 to access the demo dapp
+4. Open browser inspector to see responses from the remote Sequence Wallet
+
+## Development
+
+See [src/App.tsx](./src/App.tsx) for the source
+usage for a variety of functions. Be sure to open your browser's dev inspector to see output.
+Think of these functions as a "cookbook" for how you can perform these functions in your dapps.
+
+Also note, sequence.js is built on top of ethers.js, and is API-compatible.
+
+## Screenshots
+
+**Opening wallet from dapp:**
+
+
+
+
+**Send transaction from dapp:**
+
+Sequence Wallet is an Ethereum wallet supporting Ethereum mainnet, Polygon and more. Sequence will work
+with any blockchain which is EVM compatible and supports Ethereum's node JSON-RPC interface.
+
+Here you can see in this screenshot the call to "Send DAI" from demo-dapp
+(https://github.com/0xsequence/demo-dapp/blob/master/src/routes/HomeRoute.tsx#L420). This function demonstrates
+how you can transfer an ERC-20 token like DAI on any Ethereum network.
+
+Notice how you can pay gas fees for a transaction in either MATIC token or USDC for price of $0.01.
+
+
+
+
+
+## LICENSE
+
+Apache 2.0 or MIT (your choice)
diff --git a/.codesandbox/index.html b/.codesandbox/index.html
new file mode 100644
index 000000000..7a355ef15
--- /dev/null
+++ b/.codesandbox/index.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sequence | Demo Dapp
+
+
+
+
+
+
+
+
diff --git a/.codesandbox/package.json b/.codesandbox/package.json
new file mode 100644
index 000000000..438e0f488
--- /dev/null
+++ b/.codesandbox/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "demo-dapp",
+ "description": "Ethereum Demo Dapp built on Sequence stack",
+ "version": "0.1.0",
+ "private": true,
+ "homepage": "demo-dapp",
+ "scripts": {
+ "dev": "BROWSER=none pnpm start",
+ "start": "vite",
+ "build": "tsc && vite build",
+ "typecheck": "tsc --noEmit",
+ "serve": "vite preview",
+ "dist": "pnpm build",
+ "link-sequence": "pnpm run clear:vite:cache && ../sequence.js/scripts/pnpm-link.sh link",
+ "unlink-sequence": "pnpm run clear:vite:cache && ../sequence.js/scripts/pnpm-link.sh unlink",
+ "clear:vite:cache": "rimraf node_modules/.vite/"
+ },
+ "dependencies": {
+ "0xsequence": "2.2.3",
+ "@0xsequence/abi": "2.2.13",
+ "@0xsequence/design-system": "^1.8.1",
+ "@0xsequence/ethauth": "^1.0.0",
+ "@0xsequence/network": "2.2.13",
+ "@0xsequence/provider": "2.2.13",
+ "@0xsequence/utils": "2.2.13",
+ "@types/node": "^20.11.30",
+ "@types/react": "^18.3.7",
+ "@types/react-dom": "^18.3.0",
+ "@vanilla-extract/css": "^1.14.1",
+ "ethers": "^6.13.4",
+ "framer-motion": "^9.0.1",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "typescript": "^4.5.5"
+ },
+ "devDependencies": {
+ "@vanilla-extract/vite-plugin": "^4.0.6",
+ "@vitejs/plugin-react": "^4.2.1",
+ "vite": "^5.2.6",
+ "vite-plugin-svgr": "^4.2.0",
+ "vite-tsconfig-paths": "^4.3.2"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ }
+}
diff --git a/.codesandbox/pnpm-lock.yaml b/.codesandbox/pnpm-lock.yaml
new file mode 100644
index 000000000..14abf5d34
--- /dev/null
+++ b/.codesandbox/pnpm-lock.yaml
@@ -0,0 +1,4111 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ 0xsequence:
+ specifier: 2.2.3
+ version: 2.2.3(ethers@6.13.4)
+ '@0xsequence/abi':
+ specifier: 2.2.13
+ version: 2.2.13
+ '@0xsequence/design-system':
+ specifier: ^1.8.1
+ version: 1.8.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@0xsequence/ethauth':
+ specifier: ^1.0.0
+ version: 1.0.0(ethers@6.13.4)
+ '@0xsequence/network':
+ specifier: 2.2.13
+ version: 2.2.13(ethers@6.13.4)
+ '@0xsequence/provider':
+ specifier: 2.2.13
+ version: 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils':
+ specifier: 2.2.13
+ version: 2.2.13(ethers@6.13.4)
+ '@types/node':
+ specifier: ^20.11.30
+ version: 20.11.30
+ '@types/react':
+ specifier: ^18.3.7
+ version: 18.3.7
+ '@types/react-dom':
+ specifier: ^18.3.0
+ version: 18.3.0
+ '@vanilla-extract/css':
+ specifier: ^1.14.1
+ version: 1.14.1
+ ethers:
+ specifier: ^6.13.4
+ version: 6.13.4
+ framer-motion:
+ specifier: ^9.0.1
+ version: 9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ typescript:
+ specifier: ^4.5.5
+ version: 4.5.5
+ devDependencies:
+ '@vanilla-extract/vite-plugin':
+ specifier: ^4.0.6
+ version: 4.0.6(@types/node@20.11.30)(vite@5.2.6(@types/node@20.11.30))
+ '@vitejs/plugin-react':
+ specifier: ^4.2.1
+ version: 4.2.1(vite@5.2.6(@types/node@20.11.30))
+ vite:
+ specifier: ^5.2.6
+ version: 5.2.6(@types/node@20.11.30)
+ vite-plugin-svgr:
+ specifier: ^4.2.0
+ version: 4.2.0(rollup@4.21.3)(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30))
+ vite-tsconfig-paths:
+ specifier: ^4.3.2
+ version: 4.3.2(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30))
+
+packages:
+
+ 0xsequence@2.2.3:
+ resolution: {integrity: sha512-1P/U1oEu51vCA6VgrzCt1pPjEx6iKd44NLLjHTEmmUxEKcesEFHtzhfA9H6tY/O2liqVT8SpS5NoHnQqtoyEAg==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/abi@2.2.13':
+ resolution: {integrity: sha512-cZDR83SNxpXTD9vZoJAtmn6/YgvttN0gmeB8feQ5cpo8yd+AeJvQpUGMPR6Ud1MQGsvcPTLnTwKkL432Pc6UGQ==}
+
+ '@0xsequence/abi@2.2.3':
+ resolution: {integrity: sha512-y0JxKXHKqkJh2i2d8F+Ql7P5jyGujJ2P28pN4YTcYacqmpDZqYi3d0Bf+uMgroWfncKBZDBETGxjWNvUYmhivg==}
+
+ '@0xsequence/account@2.2.13':
+ resolution: {integrity: sha512-+kGyDsLEYOQUMhahtJps1N2j0jLXl0hAl2ilGA4NiALck7JP1Q/IO0RtkOlfSgjqFdyaipGvhYYyJuok2ARF5w==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/account@2.2.3':
+ resolution: {integrity: sha512-Q0czXuoNpwwECwMS4GGkmoh0xIEfQrATi5gcyLlhA5kDu4Idsws3dy95D4fkTXTY2kt7JUNuG79XEmq5L2GciQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/api@2.2.13':
+ resolution: {integrity: sha512-UmFMdLRCOfUGT2WqXzHE91sm+XU7eossdoKZ74W/F1ZTBU8XRa4DldQ0alKjff5x4Hxe/wIjppBPE9pQUzGYxA==}
+
+ '@0xsequence/api@2.2.3':
+ resolution: {integrity: sha512-qwNcAWb4LbewZqn/39WHU/te1Wi+h7JJ2kuu9RRcV+rore3Z3zc7SqxHqtxoVMUOKlubmDEv/Y4BsL00m6XLmQ==}
+
+ '@0xsequence/auth@2.2.13':
+ resolution: {integrity: sha512-3UQ6/zDhrNO5BVsgiLwCfQq4Nmbd1W0Ync/FNug8Yum1i9r2il54bUZRtauct6uMUaotAqNG4l/nzy105v93QQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/auth@2.2.3':
+ resolution: {integrity: sha512-Ct5ECn5qigaSMDZ6j9vvGX3eaeSO9P9bAoknImhFURH4dsC7Dz03Z3oYbP/78oKX2RqV3uu8c8NxAWzYjBLuNg==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/core@2.2.13':
+ resolution: {integrity: sha512-tu6OEGbDLg1KfMb+YOn0Z5BsYbK3UFBjuPVHRx7SpmCsZPEApJqqRKHpTYah2T3bmYIJy9tRBtqstfTsniSgng==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/core@2.2.3':
+ resolution: {integrity: sha512-Bt2PsAIDSOjRx82uTqDYmOdin1DYVtwlt/TYb27Q/oNSY8MA1GG5NqEHefssi/ohXAsPRNeLMaspfmX0/BUTWw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/design-system@1.8.1':
+ resolution: {integrity: sha512-VsYBYR8d2UXnte5MvysyWtrdYpyvTYpQFbpNW8nOseAB6lWc8q9miTwYzeUy0fq90BQQ1YfE95EbJ4BjGTYInw==}
+ peerDependencies:
+ framer-motion: '>=6'
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@0xsequence/ethauth@1.0.0':
+ resolution: {integrity: sha512-piihXzbS8Sq7P670a+GyTm3igTJL3Ts6pqjJcC0Sv86yqeK6QD0pzJP4APP+/IQa5k+0s2l1SeZwMjR7gSPtCA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/guard@2.2.3':
+ resolution: {integrity: sha512-B9FRVJauAs/Asispe0p6wk3zAQubL9c6laC3xsCnFq3Qkv5t4VsGudTBe6ewx0xTeyQwEnVkneVgnUcnUP9xwA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/indexer@2.2.13':
+ resolution: {integrity: sha512-RFjjjckuAhM0vgYFO1RgYyBqsUrU54l2N/Isr5DPSLCCczp+qcopNuFMB0e0FuvzUP1buunxTjHRVjFH75kQEA==}
+
+ '@0xsequence/indexer@2.2.3':
+ resolution: {integrity: sha512-bt74b5+SV5aGM+ZZfUmSU7rkttmc8I7OsQovQZBDw5YRVWPVEeVPZeX4ws4bZwiuYifD954A2Z/2MX1brH76Sw==}
+
+ '@0xsequence/metadata@2.2.13':
+ resolution: {integrity: sha512-RpkIXSYKEt/W6zCoY99Q44OMjjLf//Pi8yImitXNh8IqTZqio54L9Xo4L+5ryz6rjPmaY3Mce1J1D5YJam0h4g==}
+
+ '@0xsequence/metadata@2.2.3':
+ resolution: {integrity: sha512-Y7/Prw0CVxTuw59B0DnE0WnjbhJaPATibThWb13Y6W99M4NvQi5NlfS2KagfsMo5MHb5iFRjJHrCFovbv+MiuA==}
+
+ '@0xsequence/migration@2.2.13':
+ resolution: {integrity: sha512-YcdjW7BRrQiOvhmSuvTM3GqklZVfO3dpbwSNqT0bMqwx/9YzE0CsVZVSMYrqVq5njyNFZjs42zazLdcrqqA2Ag==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/migration@2.2.3':
+ resolution: {integrity: sha512-Q1+YePKzfPnCF9Rk0Tc9EqYtD1BdLym8ZEjco6b5BtyAGyIF7UefWql57IVEXBB/H1DtF+M7JHoZusvmS6atTw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/network@2.2.13':
+ resolution: {integrity: sha512-U8sVC2nWokPtQzIXwNKOP/mgkkuvjxYmQrgITkc8YDTAQOYPu6n/4lIqQ2//jjSfloniMK00tDpfUd5fCFbsUA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/network@2.2.3':
+ resolution: {integrity: sha512-oOw4oB/Y6EqTvFHYzMX9bjpizj8DQxkUGdQLBcs3R1ZLipbbwhMKWfBf9BoXAl1YUthyFKI5rl9v0MJMxaq3Bg==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/provider@2.2.13':
+ resolution: {integrity: sha512-p5DlA2eHWhgfyCK7JQL3k7qT+aNiNxFkiAMbO2Q/eRnBnmrKcN0dK9HjuK1lWvWH3eZniEgK/M9Kec6nfixbcw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/provider@2.2.3':
+ resolution: {integrity: sha512-QxHBbgLGGpVsnEiFI5uvpuEUdl7JfxQ/i2T28aUK4vtUtiYLTiOnNwQy9RiK/bGPtqx9vh3Xh05G8c1KKWRqyw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/relayer@2.2.13':
+ resolution: {integrity: sha512-fnt4AJ1u9CPwx7JJwpZ7UbJ3eN2LOG0Wuwe4FS9OSfxCOhbokELRSWegToEyH6ew6FRPvsuRMN/im3Bu3Og0QQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/relayer@2.2.3':
+ resolution: {integrity: sha512-baFGhIQIXhYcRNWV2mzFss+EXYkSlsnMI0+G3ZOUAfTkPR5Tv8iL/srvM0d+/ByhCsGwe8fqNfEbFTGIDOVviA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/replacer@2.2.13':
+ resolution: {integrity: sha512-+cTsda4HKzLpCzERrcPSEn5ei/lj4vPIs6kAS9aqO1XOWqeyslPWcPbfMgMbMbn+/vmbnVuqUXDOgRZqkZ2FEA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/replacer@2.2.3':
+ resolution: {integrity: sha512-onYf/GjYUkah1GTqimBliQQzCF9ksfb53ugJKibN1Q1uT2mKJvO1NMxXviuduXan2A+Rdr8/tTkfZwMnbVoX+A==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/sessions@2.2.13':
+ resolution: {integrity: sha512-duClp86VeyaMuyKItByK2rIbsDQHDiMP22yLQeCN+Si+bk0T7Jta9rHP+PoAOncKpbRDJZSqSX1hmzYgB4LD5g==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/sessions@2.2.3':
+ resolution: {integrity: sha512-MJgOZkG3fZFc0sidYY1OzFGte2HVRjmkrxDukuwlEsxvN2M+HikgrpFwVcG5u1n2uiJGA0Uzq85UL7jvF5QozQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/signhub@2.2.13':
+ resolution: {integrity: sha512-yCo3l3a4nYNy5LOxcH4xEoGmQqMfWq9BxkUF+Y8xDd001L7cynaGzAS7s+5Fs4B+HD9obC7NxwSOeoJ6qqk4xw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/signhub@2.2.3':
+ resolution: {integrity: sha512-Gk0DitT/Su+gMDAa/r6mNOBX+RcWQfd75CnuOmJxBZT/jH6uxrbtlz/DDTR/P1gjf1EyYJ7NjibszMvr9sawzA==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/utils@2.2.13':
+ resolution: {integrity: sha512-V4uip1fCZAzp5O2S+nkKnwrqmzzC7em1Mc4HJvUX+fqT0jzw20BZt0CNlX34DgW6E6MzBvWnrX+DTfz/+alBWQ==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/utils@2.2.3':
+ resolution: {integrity: sha512-2F9dMqlgsoPdXk8xfOc7VuTrEtsNukadI5HSUYpLF+J1HZBamkCa/shgiHoKIZULiDt+scZ/3amVXvQUk0Zj1w==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/wallet@2.2.13':
+ resolution: {integrity: sha512-lCD+Z6E4bpZCkwAttFy4P1iAM1ZkaiN9zo8dw4+unSVqzVslPPKoWNCX+b16Qg1pZEqe0yPjbqqon0eH/iHGyw==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@0xsequence/wallet@2.2.3':
+ resolution: {integrity: sha512-lS/eVCQtjm4TAL4Xc+Hec7YZAoAZJ5XLRd3eo7oV8Seakwa2GagT3MeGnpMgRUTpySf4i9k3iDcL6fkpxWVvMg==}
+ peerDependencies:
+ ethers: '>=6'
+
+ '@adraffy/ens-normalize@1.10.1':
+ resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==}
+
+ '@ampproject/remapping@2.2.1':
+ resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
+ engines: {node: '>=6.0.0'}
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@babel/code-frame@7.23.5':
+ resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/code-frame@7.24.2':
+ resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.23.5':
+ resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.23.7':
+ resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.24.3':
+ resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.23.6':
+ resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.24.1':
+ resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.23.6':
+ resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-environment-visitor@7.22.20':
+ resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-function-name@7.23.0':
+ resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-hoist-variables@7.22.5':
+ resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.22.15':
+ resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.23.3':
+ resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.22.5':
+ resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.24.0':
+ resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-simple-access@7.22.5':
+ resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-split-export-declaration@7.22.6':
+ resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.22.5':
+ resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.23.4':
+ resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.24.1':
+ resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.22.20':
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.22.5':
+ resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.23.5':
+ resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.23.8':
+ resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.24.1':
+ resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/highlight@7.23.4':
+ resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/highlight@7.24.2':
+ resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.23.6':
+ resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/parser@7.24.1':
+ resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-typescript@7.24.1':
+ resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-self@7.23.3':
+ resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.23.3':
+ resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.24.1':
+ resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.22.15':
+ resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.24.0':
+ resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.23.7':
+ resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.24.1':
+ resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.22.5':
+ resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.23.6':
+ resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.24.0':
+ resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
+ engines: {node: '>=6.9.0'}
+
+ '@databeat/tracker@0.9.3':
+ resolution: {integrity: sha512-eGsiNU/CRFujcNtUUqvBiqveCs6S6SiAhalXPDodbk74d3FzvLqHDn5k6WfOEJIhrP3CbYgfMXL0nk51s/rQsg==}
+
+ '@emotion/hash@0.9.1':
+ resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
+
+ '@emotion/is-prop-valid@0.8.8':
+ resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
+
+ '@emotion/memoize@0.7.4':
+ resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
+
+ '@esbuild/aix-ppc64@0.19.12':
+ resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.20.2':
+ resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.19.12':
+ resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.20.2':
+ resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.19.12':
+ resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.20.2':
+ resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.19.12':
+ resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.20.2':
+ resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.19.12':
+ resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.20.2':
+ resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.19.12':
+ resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.20.2':
+ resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.19.12':
+ resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.20.2':
+ resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.19.12':
+ resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.20.2':
+ resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.19.12':
+ resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.20.2':
+ resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.19.12':
+ resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.20.2':
+ resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.19.12':
+ resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.20.2':
+ resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.19.12':
+ resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.20.2':
+ resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.19.12':
+ resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.20.2':
+ resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.19.12':
+ resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.20.2':
+ resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.19.12':
+ resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.20.2':
+ resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.19.12':
+ resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.20.2':
+ resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.19.12':
+ resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.20.2':
+ resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.19.12':
+ resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.20.2':
+ resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-x64@0.19.12':
+ resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.20.2':
+ resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.19.12':
+ resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.20.2':
+ resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.19.12':
+ resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.20.2':
+ resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.19.12':
+ resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.20.2':
+ resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.19.12':
+ resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.20.2':
+ resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@floating-ui/core@1.6.0':
+ resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==}
+
+ '@floating-ui/dom@1.6.3':
+ resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==}
+
+ '@floating-ui/react-dom@2.0.8':
+ resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.1':
+ resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==}
+
+ '@jridgewell/gen-mapping@0.3.3':
+ resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/gen-mapping@0.3.5':
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.0':
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.1':
+ resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.1.2':
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.4.14':
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+
+ '@jridgewell/sourcemap-codec@1.4.15':
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+ '@jridgewell/trace-mapping@0.3.18':
+ resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
+
+ '@jridgewell/trace-mapping@0.3.21':
+ resolution: {integrity: sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@motionone/animation@10.15.1':
+ resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==}
+
+ '@motionone/dom@10.16.2':
+ resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==}
+
+ '@motionone/easing@10.15.1':
+ resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==}
+
+ '@motionone/generators@10.15.1':
+ resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==}
+
+ '@motionone/types@10.15.1':
+ resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==}
+
+ '@motionone/utils@10.15.1':
+ resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==}
+
+ '@noble/curves@1.2.0':
+ resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
+
+ '@noble/hashes@1.3.2':
+ resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
+ engines: {node: '>= 16'}
+
+ '@noble/hashes@1.6.1':
+ resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==}
+ engines: {node: ^14.21.3 || >=16}
+
+ '@radix-ui/number@1.1.0':
+ resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
+
+ '@radix-ui/primitive@1.1.0':
+ resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
+
+ '@radix-ui/react-arrow@1.1.0':
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-aspect-ratio@1.1.0':
+ resolution: {integrity: sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-checkbox@1.1.1':
+ resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-collapsible@1.1.0':
+ resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-collection@1.1.0':
+ resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-compose-refs@1.1.0':
+ resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.1.0':
+ resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dialog@1.1.1':
+ resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-direction@1.1.0':
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dismissable-layer@1.1.0':
+ resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-dropdown-menu@2.1.1':
+ resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-focus-guards@1.1.0':
+ resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-focus-scope@1.1.0':
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-id@1.1.0':
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-menu@2.1.1':
+ resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-popper@1.2.0':
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-portal@1.1.1':
+ resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-presence@1.1.0':
+ resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-primitive@2.0.0':
+ resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-progress@1.1.0':
+ resolution: {integrity: sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-radio-group@1.2.0':
+ resolution: {integrity: sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-roving-focus@1.1.0':
+ resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-select@2.1.1':
+ resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-slot@1.1.0':
+ resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-switch@1.1.0':
+ resolution: {integrity: sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-tabs@1.1.0':
+ resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-toast@1.2.1':
+ resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-tooltip@1.1.2':
+ resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-use-callback-ref@1.1.0':
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-controllable-state@1.1.0':
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-escape-keydown@1.1.0':
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.1.0':
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-previous@1.1.0':
+ resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-rect@1.1.0':
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-size@1.1.0':
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-visually-hidden@1.1.0':
+ resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/rect@1.1.0':
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+
+ '@rollup/pluginutils@5.1.0':
+ resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.13.1':
+ resolution: {integrity: sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm-eabi@4.21.3':
+ resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.13.1':
+ resolution: {integrity: sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.21.3':
+ resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.13.1':
+ resolution: {integrity: sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-arm64@4.21.3':
+ resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.13.1':
+ resolution: {integrity: sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.21.3':
+ resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.13.1':
+ resolution: {integrity: sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.21.3':
+ resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.21.3':
+ resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.13.1':
+ resolution: {integrity: sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.21.3':
+ resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.13.1':
+ resolution: {integrity: sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.21.3':
+ resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.21.3':
+ resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.13.1':
+ resolution: {integrity: sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.21.3':
+ resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.13.1':
+ resolution: {integrity: sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.21.3':
+ resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.13.1':
+ resolution: {integrity: sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.21.3':
+ resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.13.1':
+ resolution: {integrity: sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.21.3':
+ resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-win32-arm64-msvc@4.13.1':
+ resolution: {integrity: sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-arm64-msvc@4.21.3':
+ resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.13.1':
+ resolution: {integrity: sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.21.3':
+ resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.13.1':
+ resolution: {integrity: sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.21.3':
+ resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0':
+ resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0':
+ resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0':
+ resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0':
+ resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0':
+ resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0':
+ resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-preset@8.1.0':
+ resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/core@8.1.0':
+ resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==}
+ engines: {node: '>=14'}
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==}
+ engines: {node: '>=14'}
+
+ '@svgr/plugin-jsx@8.1.0':
+ resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.6.8':
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.20.5':
+ resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==}
+
+ '@types/estree@1.0.5':
+ resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+
+ '@types/node@20.11.30':
+ resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==}
+
+ '@types/node@22.7.5':
+ resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==}
+
+ '@types/prop-types@15.7.13':
+ resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
+
+ '@types/react-dom@18.3.0':
+ resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==}
+
+ '@types/react@18.3.7':
+ resolution: {integrity: sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==}
+
+ '@vanilla-extract/babel-plugin-debug-ids@1.0.5':
+ resolution: {integrity: sha512-Rc9A6ylsw7EBErmpgqCMvc/Z/eEZxI5k1xfLQHw7f5HHh3oc5YfzsAsYU/PdmSNjF1dp3sGEViBdDltvwnfVaA==}
+
+ '@vanilla-extract/css@1.14.1':
+ resolution: {integrity: sha512-V4JUuHNjZgl64NGfkDJePqizkNgiSpphODtZEs4cCPuxLAzwOUJYATGpejwimJr1n529kq4DEKWexW22LMBokw==}
+
+ '@vanilla-extract/integration@7.1.1':
+ resolution: {integrity: sha512-2JjDKL2HDTazis4oTkUFsQFUyw61k8oym9r0NOLSJC0JB0W25W1ryVZvDx74d3deIyB5AWbCselyzl3gja30kQ==}
+
+ '@vanilla-extract/private@1.0.3':
+ resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==}
+
+ '@vanilla-extract/vite-plugin@4.0.6':
+ resolution: {integrity: sha512-uT2AhzxEC8qdn7SFxD/MHF7pxyFMb2e7HY3+isyPDzkTyIdiA/ZXk7qwWhcigFMNCJ6YuyxFQJmiDhP9U9oOmg==}
+ peerDependencies:
+ vite: ^4.0.3 || ^5.0.0
+
+ '@vitejs/plugin-react@4.2.1':
+ resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0
+
+ acorn@8.11.3:
+ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ aes-js@4.0.0-beta.5:
+ resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==}
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-hidden@1.2.4:
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
+ engines: {node: '>=10'}
+
+ browserslist@4.22.2:
+ resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ caniuse-lite@1.0.30001579:
+ resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==}
+
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ css-what@6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deep-object-diff@1.1.9:
+ resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ electron-to-chromium@1.4.638:
+ resolution: {integrity: sha512-gpmbAG2LbfPKcDaL5m9IKutKjUx4ZRkvGNkgL/8nKqxkXsBVYykVULboWlqCrHsh3razucgDJDuKoWJmGPdItA==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ esbuild@0.19.12:
+ resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ esbuild@0.20.2:
+ resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ escalade@3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ ethers@6.13.4:
+ resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==}
+ engines: {node: '>=14.0.0'}
+
+ eval@0.1.8:
+ resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==}
+ engines: {node: '>= 0.8'}
+
+ eventemitter2@6.4.9:
+ resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ framer-motion@9.0.1:
+ resolution: {integrity: sha512-0EP7+b/hnsbrFOum9zU+23Fq2cJJrLOqv/yJ26fIzK4CC33ZAjXZGi1/XyblbgnUF0cxZ/SEDj5IYHeQo42qNg==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globrex@0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ hey-listen@1.0.8:
+ resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
+
+ idb@7.1.1:
+ resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ javascript-stringify@2.1.0:
+ resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==}
+
+ js-base64@3.7.7:
+ resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonc-parser@3.2.1:
+ resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ media-query-parser@2.0.2:
+ resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==}
+
+ mlly@1.6.1:
+ resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==}
+
+ modern-ahocorasick@1.0.1:
+ resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==}
+
+ ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ node-releases@2.0.14:
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+
+ outdent@0.8.0:
+ resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+ picocolors@1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ pkg-types@1.0.3:
+ resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+
+ postcss@8.4.38:
+ resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-hook-form@7.53.0:
+ resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: ^16.8.0 || ^17 || ^18 || ^19
+
+ react-refresh@0.14.0:
+ resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
+ engines: {node: '>=0.10.0'}
+
+ react-remove-scroll-bar@2.3.6:
+ resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-remove-scroll@2.5.7:
+ resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-style-singleton@2.2.1:
+ resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ require-like@0.1.2:
+ resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ rollup@4.13.1:
+ resolution: {integrity: sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ rollup@4.21.3:
+ resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+ source-map-js@1.2.0:
+ resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ engines: {node: '>=0.10.0'}
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ svg-parser@2.0.4:
+ resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+
+ to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ tsconfck@3.0.3:
+ resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ tslib@2.6.1:
+ resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==}
+
+ tslib@2.6.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
+ tslib@2.7.0:
+ resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
+
+ typescript@4.5.5:
+ resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ ufo@1.5.3:
+ resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==}
+
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+ update-browserslist-db@1.0.13:
+ resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ use-callback-ref@1.3.2:
+ resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sidecar@1.1.2:
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ vite-node@1.4.0:
+ resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
+ vite-plugin-svgr@4.2.0:
+ resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==}
+ peerDependencies:
+ vite: ^2.6.0 || 3 || 4 || 5
+
+ vite-tsconfig-paths@4.3.2:
+ resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==}
+ peerDependencies:
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite@5.2.6:
+ resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ webextension-polyfill@0.10.0:
+ resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==}
+
+ ws@8.17.1:
+ resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ 0xsequence@2.2.3(ethers@6.13.4):
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/account': 2.2.3(ethers@6.13.4)
+ '@0xsequence/api': 2.2.3
+ '@0xsequence/auth': 2.2.3(ethers@6.13.4)
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/guard': 2.2.3(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.3
+ '@0xsequence/metadata': 2.2.3
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/provider': 2.2.3(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.3(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/abi@2.2.13': {}
+
+ '@0xsequence/abi@2.2.3': {}
+
+ '@0xsequence/account@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.13(ethers@6.13.4)
+ '@0xsequence/network': 2.2.13(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/account@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/api@2.2.13': {}
+
+ '@0xsequence/api@2.2.3': {}
+
+ '@0xsequence/auth@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/account': 2.2.13(ethers@6.13.4)
+ '@0xsequence/api': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/ethauth': 1.0.0(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.13
+ '@0xsequence/metadata': 2.2.13
+ '@0xsequence/migration': 2.2.13(ethers@6.13.4)
+ '@0xsequence/network': 2.2.13(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.13(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/auth@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/account': 2.2.3(ethers@6.13.4)
+ '@0xsequence/api': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/ethauth': 1.0.0(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.3
+ '@0xsequence/metadata': 2.2.3
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/sessions': 2.2.3(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/core@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/core@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/design-system@1.8.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-aspect-ratio': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-checkbox': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-dropdown-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-progress': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-radio-group': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-select': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-switch': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-tabs': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-toast': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-tooltip': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ framer-motion: 9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-hook-form: 7.53.0(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+
+ '@0xsequence/ethauth@1.0.0(ethers@6.13.4)':
+ dependencies:
+ ethers: 6.13.4
+ js-base64: 3.7.7
+
+ '@0xsequence/guard@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/account': 2.2.3(ethers@6.13.4)
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/indexer@2.2.13': {}
+
+ '@0xsequence/indexer@2.2.3': {}
+
+ '@0xsequence/metadata@2.2.13': {}
+
+ '@0xsequence/metadata@2.2.3': {}
+
+ '@0xsequence/migration@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/migration@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/network@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.13
+ '@0xsequence/relayer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/network@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/indexer': 2.2.3
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/provider@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/account': 2.2.13(ethers@6.13.4)
+ '@0xsequence/auth': 2.2.13(ethers@6.13.4)
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.13(ethers@6.13.4)
+ '@0xsequence/network': 2.2.13(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.13(ethers@6.13.4)
+ '@databeat/tracker': 0.9.3
+ ethers: 6.13.4
+ eventemitter2: 6.4.9
+ webextension-polyfill: 0.10.0
+
+ '@0xsequence/provider@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/account': 2.2.3(ethers@6.13.4)
+ '@0xsequence/auth': 2.2.3(ethers@6.13.4)
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ '@0xsequence/wallet': 2.2.3(ethers@6.13.4)
+ '@databeat/tracker': 0.9.3
+ ethers: 6.13.4
+ eventemitter2: 6.4.9
+ webextension-polyfill: 0.10.0
+
+ '@0xsequence/relayer@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/relayer@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/replacer@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/replacer@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/sessions@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.13(ethers@6.13.4)
+ '@0xsequence/replacer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+ idb: 7.1.1
+
+ '@0xsequence/sessions@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/migration': 2.2.3(ethers@6.13.4)
+ '@0xsequence/replacer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+ idb: 7.1.1
+
+ '@0xsequence/signhub@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/signhub@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/utils@2.2.13(ethers@6.13.4)':
+ dependencies:
+ ethers: 6.13.4
+ js-base64: 3.7.7
+
+ '@0xsequence/utils@2.2.3(ethers@6.13.4)':
+ dependencies:
+ ethers: 6.13.4
+ js-base64: 3.7.7
+
+ '@0xsequence/wallet@2.2.13(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.13
+ '@0xsequence/core': 2.2.13(ethers@6.13.4)
+ '@0xsequence/network': 2.2.13(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.13(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.13(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.13(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@0xsequence/wallet@2.2.3(ethers@6.13.4)':
+ dependencies:
+ '@0xsequence/abi': 2.2.3
+ '@0xsequence/core': 2.2.3(ethers@6.13.4)
+ '@0xsequence/network': 2.2.3(ethers@6.13.4)
+ '@0xsequence/relayer': 2.2.3(ethers@6.13.4)
+ '@0xsequence/signhub': 2.2.3(ethers@6.13.4)
+ '@0xsequence/utils': 2.2.3(ethers@6.13.4)
+ ethers: 6.13.4
+
+ '@adraffy/ens-normalize@1.10.1': {}
+
+ '@ampproject/remapping@2.2.1':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.18
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@babel/code-frame@7.23.5':
+ dependencies:
+ '@babel/highlight': 7.23.4
+ chalk: 2.4.2
+
+ '@babel/code-frame@7.24.2':
+ dependencies:
+ '@babel/highlight': 7.24.2
+ picocolors: 1.0.0
+
+ '@babel/compat-data@7.23.5': {}
+
+ '@babel/core@7.23.7':
+ dependencies:
+ '@ampproject/remapping': 2.2.1
+ '@babel/code-frame': 7.23.5
+ '@babel/generator': 7.23.6
+ '@babel/helper-compilation-targets': 7.23.6
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7)
+ '@babel/helpers': 7.23.8
+ '@babel/parser': 7.23.6
+ '@babel/template': 7.22.15
+ '@babel/traverse': 7.23.7
+ '@babel/types': 7.23.6
+ convert-source-map: 2.0.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/core@7.24.3':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.24.2
+ '@babel/generator': 7.24.1
+ '@babel/helper-compilation-targets': 7.23.6
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
+ '@babel/helpers': 7.24.1
+ '@babel/parser': 7.24.1
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ convert-source-map: 2.0.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.23.6':
+ dependencies:
+ '@babel/types': 7.23.6
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.21
+ jsesc: 2.5.2
+
+ '@babel/generator@7.24.1':
+ dependencies:
+ '@babel/types': 7.24.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 2.5.2
+
+ '@babel/helper-compilation-targets@7.23.6':
+ dependencies:
+ '@babel/compat-data': 7.23.5
+ '@babel/helper-validator-option': 7.23.5
+ browserslist: 4.22.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-environment-visitor@7.22.20': {}
+
+ '@babel/helper-function-name@7.23.0':
+ dependencies:
+ '@babel/template': 7.22.15
+ '@babel/types': 7.23.6
+
+ '@babel/helper-hoist-variables@7.22.5':
+ dependencies:
+ '@babel/types': 7.22.5
+
+ '@babel/helper-module-imports@7.22.15':
+ dependencies:
+ '@babel/types': 7.23.6
+
+ '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.20
+
+ '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)':
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.20
+
+ '@babel/helper-plugin-utils@7.22.5': {}
+
+ '@babel/helper-plugin-utils@7.24.0': {}
+
+ '@babel/helper-simple-access@7.22.5':
+ dependencies:
+ '@babel/types': 7.22.5
+
+ '@babel/helper-split-export-declaration@7.22.6':
+ dependencies:
+ '@babel/types': 7.22.5
+
+ '@babel/helper-string-parser@7.22.5': {}
+
+ '@babel/helper-string-parser@7.23.4': {}
+
+ '@babel/helper-string-parser@7.24.1': {}
+
+ '@babel/helper-validator-identifier@7.22.20': {}
+
+ '@babel/helper-validator-identifier@7.22.5': {}
+
+ '@babel/helper-validator-option@7.23.5': {}
+
+ '@babel/helpers@7.23.8':
+ dependencies:
+ '@babel/template': 7.22.15
+ '@babel/traverse': 7.23.7
+ '@babel/types': 7.23.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helpers@7.24.1':
+ dependencies:
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/highlight@7.23.4':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+
+ '@babel/highlight@7.24.2':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ picocolors: 1.0.0
+
+ '@babel/parser@7.23.6':
+ dependencies:
+ '@babel/types': 7.23.6
+
+ '@babel/parser@7.24.1':
+ dependencies:
+ '@babel/types': 7.24.0
+
+ '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3)':
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-plugin-utils': 7.24.0
+
+ '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@babel/helper-plugin-utils': 7.22.5
+
+ '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@babel/helper-plugin-utils': 7.22.5
+
+ '@babel/runtime@7.24.1':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/template@7.22.15':
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ '@babel/parser': 7.23.6
+ '@babel/types': 7.23.6
+
+ '@babel/template@7.24.0':
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/parser': 7.24.1
+ '@babel/types': 7.24.0
+
+ '@babel/traverse@7.23.7':
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ '@babel/generator': 7.23.6
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.23.6
+ '@babel/types': 7.23.6
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/traverse@7.24.1':
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/generator': 7.24.1
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.24.1
+ '@babel/types': 7.24.0
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.22.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.22.5
+ '@babel/helper-validator-identifier': 7.22.5
+ to-fast-properties: 2.0.0
+
+ '@babel/types@7.23.6':
+ dependencies:
+ '@babel/helper-string-parser': 7.23.4
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+
+ '@babel/types@7.24.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.24.1
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+
+ '@databeat/tracker@0.9.3':
+ dependencies:
+ '@noble/hashes': 1.6.1
+
+ '@emotion/hash@0.9.1': {}
+
+ '@emotion/is-prop-valid@0.8.8':
+ dependencies:
+ '@emotion/memoize': 0.7.4
+ optional: true
+
+ '@emotion/memoize@0.7.4':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.19.12':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.20.2':
+ optional: true
+
+ '@esbuild/android-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/android-arm@0.19.12':
+ optional: true
+
+ '@esbuild/android-arm@0.20.2':
+ optional: true
+
+ '@esbuild/android-x64@0.19.12':
+ optional: true
+
+ '@esbuild/android-x64@0.20.2':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/darwin-x64@0.19.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.20.2':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-arm@0.19.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.20.2':
+ optional: true
+
+ '@esbuild/linux-ia32@0.19.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.20.2':
+ optional: true
+
+ '@esbuild/linux-loong64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.19.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.20.2':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.20.2':
+ optional: true
+
+ '@esbuild/linux-s390x@0.19.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.20.2':
+ optional: true
+
+ '@esbuild/linux-x64@0.19.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.20.2':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.20.2':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.19.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.20.2':
+ optional: true
+
+ '@esbuild/sunos-x64@0.19.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.20.2':
+ optional: true
+
+ '@esbuild/win32-arm64@0.19.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.20.2':
+ optional: true
+
+ '@esbuild/win32-ia32@0.19.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.20.2':
+ optional: true
+
+ '@esbuild/win32-x64@0.19.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.20.2':
+ optional: true
+
+ '@floating-ui/core@1.6.0':
+ dependencies:
+ '@floating-ui/utils': 0.2.1
+
+ '@floating-ui/dom@1.6.3':
+ dependencies:
+ '@floating-ui/core': 1.6.0
+ '@floating-ui/utils': 0.2.1
+
+ '@floating-ui/react-dom@2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/dom': 1.6.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@floating-ui/utils@0.2.1': {}
+
+ '@jridgewell/gen-mapping@0.3.3':
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.18
+
+ '@jridgewell/gen-mapping@0.3.5':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.0': {}
+
+ '@jridgewell/resolve-uri@3.1.1': {}
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/sourcemap-codec@1.4.14': {}
+
+ '@jridgewell/sourcemap-codec@1.4.15': {}
+
+ '@jridgewell/trace-mapping@0.3.18':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+
+ '@jridgewell/trace-mapping@0.3.21':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ '@motionone/animation@10.15.1':
+ dependencies:
+ '@motionone/easing': 10.15.1
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.2
+
+ '@motionone/dom@10.16.2':
+ dependencies:
+ '@motionone/animation': 10.15.1
+ '@motionone/generators': 10.15.1
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ hey-listen: 1.0.8
+ tslib: 2.6.2
+
+ '@motionone/easing@10.15.1':
+ dependencies:
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.2
+
+ '@motionone/generators@10.15.1':
+ dependencies:
+ '@motionone/types': 10.15.1
+ '@motionone/utils': 10.15.1
+ tslib: 2.6.2
+
+ '@motionone/types@10.15.1': {}
+
+ '@motionone/utils@10.15.1':
+ dependencies:
+ '@motionone/types': 10.15.1
+ hey-listen: 1.0.8
+ tslib: 2.6.2
+
+ '@noble/curves@1.2.0':
+ dependencies:
+ '@noble/hashes': 1.3.2
+
+ '@noble/hashes@1.3.2': {}
+
+ '@noble/hashes@1.6.1': {}
+
+ '@radix-ui/number@1.1.0': {}
+
+ '@radix-ui/primitive@1.1.0': {}
+
+ '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-aspect-ratio@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-context@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-direction@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-id@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-progress@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/number': 1.1.0
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-slot@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-use-size@1.1.0(@types/react@18.3.7)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/rect@1.1.0': {}
+
+ '@rollup/pluginutils@5.1.0(rollup@4.21.3)':
+ dependencies:
+ '@types/estree': 1.0.5
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ optionalDependencies:
+ rollup: 4.21.3
+
+ '@rollup/rollup-android-arm-eabi@4.13.1':
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.21.3':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.13.1':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.21.3':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.13.1':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.21.3':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.13.1':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.21.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.13.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.21.3':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.13.1':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.21.3':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.13.1':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.21.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.13.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.21.3':
+ optional: true
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+
+ '@svgr/babel-preset@8.1.0(@babel/core@7.23.7)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.23.7)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.7)
+
+ '@svgr/core@8.1.0(typescript@4.5.5)':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.23.7)
+ camelcase: 6.3.0
+ cosmiconfig: 8.3.6(typescript@4.5.5)
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ dependencies:
+ '@babel/types': 7.23.6
+ entities: 4.5.0
+
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@4.5.5))':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.23.7)
+ '@svgr/core': 8.1.0(typescript@4.5.5)
+ '@svgr/hast-util-to-babel-ast': 8.0.0
+ svg-parser: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.23.6
+ '@babel/types': 7.23.6
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.5
+
+ '@types/babel__generator@7.6.8':
+ dependencies:
+ '@babel/types': 7.23.6
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.23.6
+ '@babel/types': 7.23.6
+
+ '@types/babel__traverse@7.20.5':
+ dependencies:
+ '@babel/types': 7.23.6
+
+ '@types/estree@1.0.5': {}
+
+ '@types/node@20.11.30':
+ dependencies:
+ undici-types: 5.26.5
+
+ '@types/node@22.7.5':
+ dependencies:
+ undici-types: 6.19.8
+
+ '@types/prop-types@15.7.13': {}
+
+ '@types/react-dom@18.3.0':
+ dependencies:
+ '@types/react': 18.3.7
+
+ '@types/react@18.3.7':
+ dependencies:
+ '@types/prop-types': 15.7.13
+ csstype: 3.1.3
+
+ '@vanilla-extract/babel-plugin-debug-ids@1.0.5':
+ dependencies:
+ '@babel/core': 7.24.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vanilla-extract/css@1.14.1':
+ dependencies:
+ '@emotion/hash': 0.9.1
+ '@vanilla-extract/private': 1.0.3
+ chalk: 4.1.2
+ css-what: 6.1.0
+ cssesc: 3.0.0
+ csstype: 3.1.3
+ deep-object-diff: 1.1.9
+ deepmerge: 4.3.1
+ media-query-parser: 2.0.2
+ modern-ahocorasick: 1.0.1
+ outdent: 0.8.0
+
+ '@vanilla-extract/integration@7.1.1(@types/node@20.11.30)':
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3)
+ '@vanilla-extract/babel-plugin-debug-ids': 1.0.5
+ '@vanilla-extract/css': 1.14.1
+ esbuild: 0.19.12
+ eval: 0.1.8
+ find-up: 5.0.0
+ javascript-stringify: 2.1.0
+ lodash: 4.17.21
+ mlly: 1.6.1
+ outdent: 0.8.0
+ vite: 5.2.6(@types/node@20.11.30)
+ vite-node: 1.4.0(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ '@vanilla-extract/private@1.0.3': {}
+
+ '@vanilla-extract/vite-plugin@4.0.6(@types/node@20.11.30)(vite@5.2.6(@types/node@20.11.30))':
+ dependencies:
+ '@vanilla-extract/integration': 7.1.1(@types/node@20.11.30)
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ '@vitejs/plugin-react@4.2.1(vite@5.2.6(@types/node@20.11.30))':
+ dependencies:
+ '@babel/core': 7.23.7
+ '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7)
+ '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7)
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.14.0
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - supports-color
+
+ acorn@8.11.3: {}
+
+ aes-js@4.0.0-beta.5: {}
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ argparse@2.0.1: {}
+
+ aria-hidden@1.2.4:
+ dependencies:
+ tslib: 2.6.2
+
+ browserslist@4.22.2:
+ dependencies:
+ caniuse-lite: 1.0.30001579
+ electron-to-chromium: 1.4.638
+ node-releases: 2.0.14
+ update-browserslist-db: 1.0.13(browserslist@4.22.2)
+
+ cac@6.7.14: {}
+
+ callsites@3.1.0: {}
+
+ camelcase@6.3.0: {}
+
+ caniuse-lite@1.0.30001579: {}
+
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.3: {}
+
+ color-name@1.1.4: {}
+
+ convert-source-map@2.0.0: {}
+
+ cosmiconfig@8.3.6(typescript@4.5.5):
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 4.5.5
+
+ css-what@6.1.0: {}
+
+ cssesc@3.0.0: {}
+
+ csstype@3.1.3: {}
+
+ debug@4.3.4:
+ dependencies:
+ ms: 2.1.2
+
+ deep-object-diff@1.1.9: {}
+
+ deepmerge@4.3.1: {}
+
+ detect-node-es@1.1.0: {}
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.2
+
+ electron-to-chromium@1.4.638: {}
+
+ entities@4.5.0: {}
+
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ esbuild@0.19.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.19.12
+ '@esbuild/android-arm': 0.19.12
+ '@esbuild/android-arm64': 0.19.12
+ '@esbuild/android-x64': 0.19.12
+ '@esbuild/darwin-arm64': 0.19.12
+ '@esbuild/darwin-x64': 0.19.12
+ '@esbuild/freebsd-arm64': 0.19.12
+ '@esbuild/freebsd-x64': 0.19.12
+ '@esbuild/linux-arm': 0.19.12
+ '@esbuild/linux-arm64': 0.19.12
+ '@esbuild/linux-ia32': 0.19.12
+ '@esbuild/linux-loong64': 0.19.12
+ '@esbuild/linux-mips64el': 0.19.12
+ '@esbuild/linux-ppc64': 0.19.12
+ '@esbuild/linux-riscv64': 0.19.12
+ '@esbuild/linux-s390x': 0.19.12
+ '@esbuild/linux-x64': 0.19.12
+ '@esbuild/netbsd-x64': 0.19.12
+ '@esbuild/openbsd-x64': 0.19.12
+ '@esbuild/sunos-x64': 0.19.12
+ '@esbuild/win32-arm64': 0.19.12
+ '@esbuild/win32-ia32': 0.19.12
+ '@esbuild/win32-x64': 0.19.12
+
+ esbuild@0.20.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.20.2
+ '@esbuild/android-arm': 0.20.2
+ '@esbuild/android-arm64': 0.20.2
+ '@esbuild/android-x64': 0.20.2
+ '@esbuild/darwin-arm64': 0.20.2
+ '@esbuild/darwin-x64': 0.20.2
+ '@esbuild/freebsd-arm64': 0.20.2
+ '@esbuild/freebsd-x64': 0.20.2
+ '@esbuild/linux-arm': 0.20.2
+ '@esbuild/linux-arm64': 0.20.2
+ '@esbuild/linux-ia32': 0.20.2
+ '@esbuild/linux-loong64': 0.20.2
+ '@esbuild/linux-mips64el': 0.20.2
+ '@esbuild/linux-ppc64': 0.20.2
+ '@esbuild/linux-riscv64': 0.20.2
+ '@esbuild/linux-s390x': 0.20.2
+ '@esbuild/linux-x64': 0.20.2
+ '@esbuild/netbsd-x64': 0.20.2
+ '@esbuild/openbsd-x64': 0.20.2
+ '@esbuild/sunos-x64': 0.20.2
+ '@esbuild/win32-arm64': 0.20.2
+ '@esbuild/win32-ia32': 0.20.2
+ '@esbuild/win32-x64': 0.20.2
+
+ escalade@3.1.1: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ estree-walker@2.0.2: {}
+
+ ethers@6.13.4:
+ dependencies:
+ '@adraffy/ens-normalize': 1.10.1
+ '@noble/curves': 1.2.0
+ '@noble/hashes': 1.3.2
+ '@types/node': 22.7.5
+ aes-js: 4.0.0-beta.5
+ tslib: 2.7.0
+ ws: 8.17.1
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ eval@0.1.8:
+ dependencies:
+ '@types/node': 20.11.30
+ require-like: 0.1.2
+
+ eventemitter2@6.4.9: {}
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@motionone/dom': 10.16.2
+ hey-listen: 1.0.8
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ tslib: 2.6.1
+ optionalDependencies:
+ '@emotion/is-prop-valid': 0.8.8
+
+ fsevents@2.3.3:
+ optional: true
+
+ gensync@1.0.0-beta.2: {}
+
+ get-nonce@1.0.1: {}
+
+ globals@11.12.0: {}
+
+ globrex@0.1.2: {}
+
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ hey-listen@1.0.8: {}
+
+ idb@7.1.1: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ invariant@2.2.4:
+ dependencies:
+ loose-envify: 1.4.0
+
+ is-arrayish@0.2.1: {}
+
+ javascript-stringify@2.1.0: {}
+
+ js-base64@3.7.7: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@2.5.2: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json5@2.2.3: {}
+
+ jsonc-parser@3.2.1: {}
+
+ lines-and-columns@1.2.4: {}
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash@4.17.21: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.6.2
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ media-query-parser@2.0.2:
+ dependencies:
+ '@babel/runtime': 7.24.1
+
+ mlly@1.6.1:
+ dependencies:
+ acorn: 8.11.3
+ pathe: 1.1.2
+ pkg-types: 1.0.3
+ ufo: 1.5.3
+
+ modern-ahocorasick@1.0.1: {}
+
+ ms@2.1.2: {}
+
+ nanoid@3.3.7: {}
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.6.2
+
+ node-releases@2.0.14: {}
+
+ outdent@0.8.0: {}
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ path-exists@4.0.0: {}
+
+ path-type@4.0.0: {}
+
+ pathe@1.1.2: {}
+
+ picocolors@1.0.0: {}
+
+ picomatch@2.3.1: {}
+
+ pkg-types@1.0.3:
+ dependencies:
+ jsonc-parser: 3.2.1
+ mlly: 1.6.1
+ pathe: 1.1.2
+
+ postcss@8.4.38:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.0
+ source-map-js: 1.2.0
+
+ react-dom@18.3.1(react@18.3.1):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+
+ react-hook-form@7.53.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-refresh@0.14.0: {}
+
+ react-remove-scroll-bar@2.3.6(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1)
+ tslib: 2.6.2
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ react-remove-scroll@2.5.7(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-remove-scroll-bar: 2.3.6(@types/react@18.3.7)(react@18.3.1)
+ react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1)
+ tslib: 2.6.2
+ use-callback-ref: 1.3.2(@types/react@18.3.7)(react@18.3.1)
+ use-sidecar: 1.1.2(@types/react@18.3.7)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ react-style-singleton@2.2.1(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ get-nonce: 1.0.1
+ invariant: 2.2.4
+ react: 18.3.1
+ tslib: 2.6.2
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
+ regenerator-runtime@0.14.1: {}
+
+ require-like@0.1.2: {}
+
+ resolve-from@4.0.0: {}
+
+ rollup@4.13.1:
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.13.1
+ '@rollup/rollup-android-arm64': 4.13.1
+ '@rollup/rollup-darwin-arm64': 4.13.1
+ '@rollup/rollup-darwin-x64': 4.13.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.13.1
+ '@rollup/rollup-linux-arm64-gnu': 4.13.1
+ '@rollup/rollup-linux-arm64-musl': 4.13.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.13.1
+ '@rollup/rollup-linux-s390x-gnu': 4.13.1
+ '@rollup/rollup-linux-x64-gnu': 4.13.1
+ '@rollup/rollup-linux-x64-musl': 4.13.1
+ '@rollup/rollup-win32-arm64-msvc': 4.13.1
+ '@rollup/rollup-win32-ia32-msvc': 4.13.1
+ '@rollup/rollup-win32-x64-msvc': 4.13.1
+ fsevents: 2.3.3
+
+ rollup@4.21.3:
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.21.3
+ '@rollup/rollup-android-arm64': 4.21.3
+ '@rollup/rollup-darwin-arm64': 4.21.3
+ '@rollup/rollup-darwin-x64': 4.21.3
+ '@rollup/rollup-linux-arm-gnueabihf': 4.21.3
+ '@rollup/rollup-linux-arm-musleabihf': 4.21.3
+ '@rollup/rollup-linux-arm64-gnu': 4.21.3
+ '@rollup/rollup-linux-arm64-musl': 4.21.3
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3
+ '@rollup/rollup-linux-riscv64-gnu': 4.21.3
+ '@rollup/rollup-linux-s390x-gnu': 4.21.3
+ '@rollup/rollup-linux-x64-gnu': 4.21.3
+ '@rollup/rollup-linux-x64-musl': 4.21.3
+ '@rollup/rollup-win32-arm64-msvc': 4.21.3
+ '@rollup/rollup-win32-ia32-msvc': 4.21.3
+ '@rollup/rollup-win32-x64-msvc': 4.21.3
+ fsevents: 2.3.3
+ optional: true
+
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
+
+ semver@6.3.1: {}
+
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.6.2
+
+ source-map-js@1.2.0: {}
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ svg-parser@2.0.4: {}
+
+ to-fast-properties@2.0.0: {}
+
+ tsconfck@3.0.3(typescript@4.5.5):
+ optionalDependencies:
+ typescript: 4.5.5
+
+ tslib@2.6.1: {}
+
+ tslib@2.6.2: {}
+
+ tslib@2.7.0: {}
+
+ typescript@4.5.5: {}
+
+ ufo@1.5.3: {}
+
+ undici-types@5.26.5: {}
+
+ undici-types@6.19.8: {}
+
+ update-browserslist-db@1.0.13(browserslist@4.22.2):
+ dependencies:
+ browserslist: 4.22.2
+ escalade: 3.1.1
+ picocolors: 1.0.0
+
+ use-callback-ref@1.3.2(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ tslib: 2.6.2
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ use-sidecar@1.1.2(@types/react@18.3.7)(react@18.3.1):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 18.3.1
+ tslib: 2.6.2
+ optionalDependencies:
+ '@types/react': 18.3.7
+
+ vite-node@1.4.0(@types/node@20.11.30):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.4
+ pathe: 1.1.2
+ picocolors: 1.0.0
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ vite-plugin-svgr@4.2.0(rollup@4.21.3)(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30)):
+ dependencies:
+ '@rollup/pluginutils': 5.1.0(rollup@4.21.3)
+ '@svgr/core': 8.1.0(typescript@4.5.5)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@4.5.5))
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+ - typescript
+
+ vite-tsconfig-paths@4.3.2(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30)):
+ dependencies:
+ debug: 4.3.4
+ globrex: 0.1.2
+ tsconfck: 3.0.3(typescript@4.5.5)
+ optionalDependencies:
+ vite: 5.2.6(@types/node@20.11.30)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ vite@5.2.6(@types/node@20.11.30):
+ dependencies:
+ esbuild: 0.20.2
+ postcss: 8.4.38
+ rollup: 4.13.1
+ optionalDependencies:
+ '@types/node': 20.11.30
+ fsevents: 2.3.3
+
+ webextension-polyfill@0.10.0: {}
+
+ ws@8.17.1: {}
+
+ yallist@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/.codesandbox/public/favicon.ico b/.codesandbox/public/favicon.ico
new file mode 100644
index 000000000..bf5da566d
Binary files /dev/null and b/.codesandbox/public/favicon.ico differ
diff --git a/.codesandbox/public/logo192.png b/.codesandbox/public/logo192.png
new file mode 100644
index 000000000..f90c48a28
Binary files /dev/null and b/.codesandbox/public/logo192.png differ
diff --git a/.codesandbox/public/logo512.png b/.codesandbox/public/logo512.png
new file mode 100644
index 000000000..36aff8456
Binary files /dev/null and b/.codesandbox/public/logo512.png differ
diff --git a/.codesandbox/public/manifest.json b/.codesandbox/public/manifest.json
new file mode 100644
index 000000000..9db53285e
--- /dev/null
+++ b/.codesandbox/public/manifest.json
@@ -0,0 +1,25 @@
+{
+ "short_name": "Sequence Demo Dapp",
+ "name": "Ethereum Demo Dapp built on Sequence stack",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "logo192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "logo512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
diff --git a/.codesandbox/public/robots.txt b/.codesandbox/public/robots.txt
new file mode 100644
index 000000000..e9e57dc4d
--- /dev/null
+++ b/.codesandbox/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/.codesandbox/screenshots/screen-open.png b/.codesandbox/screenshots/screen-open.png
new file mode 100644
index 000000000..17fa83ccc
Binary files /dev/null and b/.codesandbox/screenshots/screen-open.png differ
diff --git a/.codesandbox/screenshots/screen-txn.png b/.codesandbox/screenshots/screen-txn.png
new file mode 100644
index 000000000..3ed768960
Binary files /dev/null and b/.codesandbox/screenshots/screen-txn.png differ
diff --git a/.codesandbox/src/App.tsx b/.codesandbox/src/App.tsx
new file mode 100644
index 000000000..05da5e5b3
--- /dev/null
+++ b/.codesandbox/src/App.tsx
@@ -0,0 +1,1348 @@
+import { AnimatePresence } from 'framer-motion'
+import React, { useState, useEffect, useMemo, SetStateAction } from 'react'
+import { ethers } from 'ethers'
+import { sequence } from '0xsequence'
+import { walletContracts } from '@0xsequence/abi'
+import {
+ Box,
+ Image,
+ Text,
+ Button,
+ ExternalLinkIcon,
+ Divider,
+ Card,
+ TransactionIcon,
+ Select,
+ TokenImage,
+ TextInput,
+ Modal
+} from '@0xsequence/design-system'
+import { ETHAuth } from '@0xsequence/ethauth'
+import { configureLogger } from '@0xsequence/utils'
+import { ConnectOptions, OpenWalletIntent, Settings } from '@0xsequence/provider'
+import { ChainId, NetworkType } from '@0xsequence/network'
+
+import { ERC_20_ABI } from './constants/abi'
+import { Console } from './components/Console'
+import { Group } from './components/Group'
+import { getDefaultChainId, toHexString } from './helpers'
+import logoUrl from './images/logo.svg'
+import skyweaverBannerUrl from './images/skyweaver-banner.png'
+import skyweaverBannerLargeUrl from './images/skyweaver-banner-large.png'
+
+configureLogger({ logLevel: 'DEBUG' })
+
+interface Environment {
+ name: string
+ walletUrl: string
+ projectAccessKey: string
+}
+
+const environments: Environment[] = [
+ {
+ name: 'production',
+ walletUrl: 'https://sequence.app',
+ projectAccessKey: 'AQAAAAAAAAbvrgpWEC2Aefg5qYStQmwjBpA'
+ },
+ {
+ name: 'development',
+ walletUrl: 'https://dev.sequence.app',
+ //projectAccessKey: 'AQAAAAAAAAVBNfoB30kz7Ph4I_Qs5mkYuDc',
+ projectAccessKey: 'AQAAAAAAAAVCXiQ9f_57R44MjorZ4SmGdhA'
+ },
+ {
+ name: 'local',
+ walletUrl: 'http://localhost:3333',
+ projectAccessKey: 'AQAAAAAAAAVCXiQ9f_57R44MjorZ4SmGdhA'
+ },
+ {
+ name: 'custom',
+ walletUrl: '',
+ projectAccessKey: ''
+ }
+]
+
+const DEFAULT_API_URL = 'https://api.sequence.app'
+
+// Specify your desired default chain id. NOTE: you can communicate to multiple
+// chains at the same time without even having to switch the network, but a default
+// chain is required.
+const defaultChainId = getDefaultChainId() || ChainId.MAINNET
+// const defaultChainId = ChainId.POLYGON
+// const defaultChainId = ChainId.GOERLI
+// const defaultChainId = ChainId.ARBITRUM
+// const defaultChainId = ChainId.AVALANCHE
+// etc.. see the full list here: https://docs.sequence.xyz/multi-chain-support
+
+// For Sequence core dev team -- app developers can ignore
+// a custom wallet app url can specified in the query string
+const urlParams = new URLSearchParams(window.location.search)
+
+const env = urlParams.get('env') ?? 'production'
+const envConfig = environments.find(x => x.name === env)
+const walletAppURL = urlParams.get('walletAppURL') ?? envConfig.walletUrl
+const projectAccessKey = urlParams.get('projectAccessKey') ?? envConfig.projectAccessKey
+const showProhibitedActions = urlParams.has('showProhibitedActions')
+
+const isCustom = walletAppURL !== envConfig.walletUrl || projectAccessKey !== envConfig.projectAccessKey
+
+if (walletAppURL && walletAppURL.length > 0) {
+ // Wallet can point to a custom wallet app url
+ // NOTICE: this is not needed, unless testing an alpha version of the wallet
+ sequence.initWallet(projectAccessKey, { defaultNetwork: defaultChainId, transports: { walletAppURL } })
+} else {
+ // Init the sequence wallet library at the top-level of your project with
+ // your designed default chain id
+ sequence.initWallet(projectAccessKey, { defaultNetwork: defaultChainId, transports: { walletAppURL } })
+}
+
+// App component
+const App = () => {
+ const [consoleMsg, setConsoleMsg] = useState(null)
+ const [email, setEmail] = useState(null)
+ const [consoleLoading, setConsoleLoading] = useState(false)
+ const [isWalletConnected, setIsWalletConnected] = useState(false)
+
+ const wallet = sequence.getWallet().getProvider()
+
+ const [showChainId, setShowChainId] = useState(wallet.getChainId())
+ const [isOpen, toggleModal] = useState(false)
+ const [warning, setWarning] = useState(false)
+
+ useMemo(() => {
+ wallet.on('chainChanged', (chainId: string) => {
+ setShowChainId(Number(BigInt(chainId)))
+ })
+ }, [])
+
+ useEffect(() => {
+ setIsWalletConnected(wallet.isConnected())
+ }, [wallet])
+
+ useEffect(() => {
+ consoleWelcomeMessage()
+ // eslint-disable-next-line
+ }, [isWalletConnected])
+
+ useEffect(() => {
+ // Wallet events
+ wallet.client.onOpen(() => {
+ console.log('wallet window opened')
+ })
+
+ wallet.client.onClose(() => {
+ console.log('wallet window closed')
+ })
+ }, [wallet])
+
+ const defaultConnectOptions: ConnectOptions = {
+ app: 'Demo Dapp',
+ askForEmail: true
+ // keepWalletOpened: true,
+ }
+
+ // Methods
+ const connect = async (connectOptions: ConnectOptions = { app: 'Demo dapp' }) => {
+ if (isWalletConnected) {
+ resetConsole()
+ appendConsoleLine('Wallet already connected!')
+ setConsoleLoading(false)
+ return
+ }
+
+ connectOptions = {
+ ...defaultConnectOptions,
+ ...connectOptions,
+ settings: {
+ ...defaultConnectOptions.settings,
+ ...connectOptions.settings
+ }
+ }
+
+ try {
+ resetConsole()
+ appendConsoleLine('Connecting')
+ const wallet = sequence.getWallet()
+
+ const connectDetails = await wallet.connect(connectOptions)
+
+ // Example of how to verify using ETHAuth via Sequence API
+ if (connectOptions.authorize && connectDetails.connected) {
+ let apiUrl = urlParams.get('apiUrl')
+
+ if (!apiUrl || apiUrl.length === 0) {
+ apiUrl = DEFAULT_API_URL
+ }
+
+ const api = new sequence.api.SequenceAPIClient(apiUrl)
+ // or just
+ // const api = new sequence.api.SequenceAPIClient('https://api.sequence.app')
+
+ const { isValid } = await api.isValidETHAuthProof({
+ chainId: connectDetails.chainId,
+ walletAddress: connectDetails.session.accountAddress,
+ ethAuthProofString: connectDetails.proof!.proofString
+ })
+
+ appendConsoleLine(`isValid (API)?: ${isValid}`)
+ }
+
+ // Example of how to verify using ETHAuth directl on the client
+ if (connectOptions.authorize) {
+ const ethAuth = new ETHAuth()
+
+ if (connectDetails.proof) {
+ const decodedProof = await ethAuth.decodeProof(connectDetails.proof.proofString, true)
+
+ const isValid = await wallet.utils.isValidTypedDataSignature(
+ wallet.getAddress(),
+ connectDetails.proof.typedData,
+ decodedProof.signature,
+ Number(BigInt(connectDetails.chainId))
+ )
+
+ appendConsoleLine(`connected using chainId: ${BigInt(connectDetails.chainId).toString()}`)
+ appendConsoleLine(`isValid (client)?: ${isValid}`)
+ }
+ }
+
+ setConsoleLoading(false)
+ if (connectDetails.connected) {
+ appendConsoleLine('Wallet connected!')
+ appendConsoleLine(`shared email: ${connectDetails.email}`)
+ setIsWalletConnected(true)
+ } else {
+ appendConsoleLine('Failed to connect wallet - ' + connectDetails.error)
+ }
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const disconnect = () => {
+ const wallet = sequence.getWallet()
+ wallet.disconnect()
+ consoleWelcomeMessage()
+ setIsWalletConnected(false)
+ }
+
+ const openWallet = () => {
+ const wallet = sequence.getWallet()
+ wallet.openWallet()
+ }
+
+ const openWalletWithSettings = () => {
+ const wallet = sequence.getWallet()
+
+ const settings: Settings = {
+ theme: 'light',
+ includedPaymentProviders: ['moonpay', 'ramp'],
+ defaultFundingCurrency: 'eth',
+ defaultPurchaseAmount: 400,
+ lockFundingCurrencyToDefault: false
+ }
+
+ const intent: OpenWalletIntent = {
+ type: 'openWithOptions',
+ options: {
+ app: 'Demo Dapp',
+ settings
+ }
+ }
+
+ const path = 'wallet/add-funds'
+ wallet.openWallet(path, intent)
+ }
+
+ const closeWallet = () => {
+ const wallet = sequence.getWallet()
+ wallet.closeWallet()
+ }
+
+ const isConnected = async () => {
+ resetConsole()
+ const wallet = sequence.getWallet()
+ appendConsoleLine(`isConnected?: ${wallet.isConnected()}`)
+ setConsoleLoading(false)
+ }
+
+ const isOpened = async () => {
+ resetConsole()
+ const wallet = sequence.getWallet()
+ appendConsoleLine(`isOpened?: ${wallet.isOpened()}`)
+ setConsoleLoading(false)
+ }
+
+ const getChainID = async () => {
+ try {
+ resetConsole()
+
+ const topChainId = wallet.getChainId()
+ appendConsoleLine(`top chainId: ${topChainId}`)
+
+ const provider = wallet.getProvider()
+ const providerChainId = provider!.getChainId()
+ appendConsoleLine(`provider.getChainId(): ${providerChainId}`)
+
+ const signer = wallet.getSigner()
+ const signerChainId = await signer.getChainId()
+ appendConsoleLine(`signer.getChainId(): ${signerChainId}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const getAccounts = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+ const address = wallet.getAddress()
+ appendConsoleLine(`getAddress(): ${address}`)
+
+ const provider = wallet.getProvider()
+ const accountList = provider.listAccounts()
+ appendConsoleLine(`accounts: ${JSON.stringify(accountList)}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const getBalance = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ const provider = wallet.getProvider()
+ const account = wallet.getAddress()
+ const balanceChk1 = await provider!.getBalance(account)
+ appendConsoleLine(`balance check 1: ${balanceChk1.toString()}`)
+
+ const signer = wallet.getSigner()
+ const balanceChk2 = await signer.getBalance()
+ appendConsoleLine(`balance check 2: ${balanceChk2.toString()}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const getNetworks = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+ const networks = await wallet.getNetworks()
+
+ appendConsoleLine(`networks: ${JSON.stringify(networks, null, 2)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const signMessageString = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ appendConsoleLine('signing message...')
+ const signer = wallet.getSigner()
+
+ const message = `1915 Robert Frost
+The Road Not Taken
+
+Two roads diverged in a yellow wood,
+And sorry I could not travel both
+And be one traveler, long I stood
+And looked down one as far as I could
+To where it bent in the undergrowth
+
+Then took the other, as just as fair,
+And having perhaps the better claim,
+Because it was grassy and wanted wear
+Though as for that the passing there
+Had worn them really about the same,
+
+And both that morning equally lay
+In leaves no step had trodden black.
+Oh, I kept the first for another day!
+Yet knowing how way leads on to way,
+I doubted if I should ever come back.
+
+I shall be telling this with a sigh
+Somewhere ages and ages hence:
+Two roads diverged in a wood, and I—
+I took the one less traveled by,
+And that has made all the difference.
+
+\u2601 \u2600 \u2602`
+
+ // sign
+ const sig = await signer.signMessage(message)
+ appendConsoleLine(`signature: ${sig}`)
+
+ const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId())
+ appendConsoleLine(`isValid?: ${isValid}`)
+ if (!isValid) throw new Error('sig invalid')
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const signMessageHex = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ appendConsoleLine('signing message...')
+ const signer = wallet.getSigner()
+
+ // Message in hex
+ const message = ethers.hexlify(ethers.toUtf8Bytes('Hello, world!'))
+
+ // sign
+ const sig = await signer.signMessage(message)
+ appendConsoleLine(`signature: ${sig}`)
+
+ const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId())
+ appendConsoleLine(`isValid?: ${isValid}`)
+ if (!isValid) throw new Error('sig invalid')
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const signMessageBytes = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ appendConsoleLine('signing message...')
+ const signer = wallet.getSigner()
+
+ // Message in hex
+ const message = ethers.toUtf8Bytes('Hello, world!')
+
+ // sign
+ const sig = await signer.signMessage(message)
+ appendConsoleLine(`signature: ${sig}`)
+
+ const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId())
+ appendConsoleLine(`isValid?: ${isValid}`)
+ if (!isValid) throw new Error('sig invalid')
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const signTypedData = async () => {
+ try {
+ resetConsole()
+ const wallet = sequence.getWallet()
+
+ appendConsoleLine('signing typedData...')
+
+ const typedData: sequence.utils.TypedData = {
+ types: {
+ Person: [
+ { name: 'name', type: 'string' },
+ { name: 'wallet', type: 'address' }
+ ],
+ Mail: [
+ { name: 'from', type: 'Person' },
+ { name: 'to', type: 'Person' },
+ { name: 'cc', type: 'Person[]' },
+ { name: 'contents', type: 'string' },
+ { name: 'attachements', type: 'string[]' }
+ ]
+ },
+ primaryType: 'Mail',
+ domain: {
+ name: 'Ether Mail',
+ version: '1',
+ chainId: 1,
+ verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
+ },
+ message: {
+ from: {
+ name: 'Cow',
+ wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826'
+ },
+ to: {
+ name: 'Bob',
+ wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
+ },
+ cc: [
+ { name: 'Dev Team', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' },
+ { name: 'Accounting', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' }
+ ],
+ contents: 'Hello, Bob!',
+ attachements: ['cat.png', 'dog.png']
+ }
+ }
+
+ const signer = wallet.getSigner()
+
+ const sig = await signer.signTypedData(typedData.domain, typedData.types, typedData.message)
+ appendConsoleLine(`signature: ${sig}`)
+
+ // validate
+ const isValid = await wallet.utils.isValidTypedDataSignature(wallet.getAddress(), typedData, sig, await signer.getChainId())
+ appendConsoleLine(`isValid?: ${isValid}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const estimateUnwrapGas = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ const wmaticContractAddress = '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270'
+ const wmaticInterface = new ethers.Interface(['function withdraw(uint256 amount)'])
+
+ const tx: sequence.transactions.Transaction = {
+ to: wmaticContractAddress,
+ data: wmaticInterface.encodeFunctionData('withdraw', ['1000000000000000000'])
+ }
+
+ const provider = wallet.getProvider()
+ const estimate = await provider.estimateGas(tx)
+
+ appendConsoleLine(`estimated gas needed for wmatic withdrawal : ${estimate.toString()}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const sendETH = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner()
+
+ appendConsoleLine(`Transfer txn on ${signer.getChainId()} chainId`)
+
+ // NOTE: on mainnet, the balance will be of ETH value
+ // and on matic, the balance will be of MATIC value
+
+ // Sending the funds to the wallet itself
+ // so we don't lose any funds ;-)
+ // (of course, you can send anywhere)
+ const toAddress = await signer.getAddress()
+
+ const tx1: sequence.transactions.Transaction = {
+ delegateCall: false,
+ revertOnError: false,
+ gasLimit: '0x55555',
+ to: toAddress,
+ value: ethers.parseEther('1.234'),
+ data: '0x'
+ }
+
+ const tx2: sequence.transactions.Transaction = {
+ delegateCall: false,
+ revertOnError: false,
+ gasLimit: '0x55555',
+ to: toAddress,
+ value: ethers.parseEther('0.4242'),
+ data: '0x'
+ }
+
+ const provider = signer.provider
+
+ const balance1 = await provider.getBalance(toAddress)
+ appendConsoleLine(`balance of ${toAddress}, before: ${balance1}`)
+
+ const txnResp = await signer.sendTransaction([tx1, tx2])
+ appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`)
+
+ const balance2 = await provider.getBalance(toAddress)
+ appendConsoleLine(`balance of ${toAddress}, after: ${balance2}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const sendSepoliaUSDC = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ // Sending the funds to the wallet itself
+ // so we don't lose any funds ;-)
+ // (of course, you can send anywhere)
+ const toAddress = await signer.getAddress()
+
+ const amount = ethers.parseUnits('1', 1)
+
+ // (USDC address on Sepolia)
+ const usdcAddress = '0x07865c6e87b9f70255377e024ace6630c1eaa37f'
+
+ const tx: sequence.transactions.Transaction = {
+ delegateCall: false,
+ revertOnError: false,
+ gasLimit: '0x55555',
+ to: usdcAddress,
+ value: 0,
+ data: new ethers.Interface(ERC_20_ABI).encodeFunctionData('transfer', [toAddress, toHexString(amount)])
+ }
+
+ const txnResp = await signer.sendTransaction([tx], { chainId: ChainId.SEPOLIA })
+ appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const sendDAI = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ // Sending the funds to the wallet itself
+ // so we don't lose any funds ;-)
+ // (of course, you can send anywhere)
+ const toAddress = await signer.getAddress()
+
+ const amount = ethers.parseUnits('0.05', 18)
+ const daiContractAddress = '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063' // (DAI address on Polygon)
+
+ const tx: sequence.transactions.Transaction = {
+ delegateCall: false,
+ revertOnError: false,
+ gasLimit: '0x55555',
+ to: daiContractAddress,
+ value: 0,
+ data: new ethers.Interface(ERC_20_ABI).encodeFunctionData('transfer', [toAddress, toHexString(amount)])
+ }
+
+ const txnResp = await signer.sendTransaction([tx])
+ appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const sendETHSidechain = async () => {
+ try {
+ const wallet = sequence.getWallet()
+
+ // Send either to Arbitrum or Optimism
+ // just pick one that is not the current chainId
+ const pick = wallet.getChainId() === ChainId.ARBITRUM ? ChainId.OPTIMISM : ChainId.ARBITRUM
+ sendETH(wallet.getSigner(pick))
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const send1155Tokens = async () => {
+ try {
+ resetConsole()
+ appendConsoleLine('TODO')
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const contractExample = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner()
+
+ const abi = [
+ 'function balanceOf(address owner) view returns (uint256)',
+ 'function decimals() view returns (uint8)',
+ 'function symbol() view returns (string)',
+ 'function transfer(address to, uint amount) returns (bool)',
+ 'event Transfer(address indexed from, address indexed to, uint amount)'
+ ]
+
+ // USD Coin (PoS) on Polygon
+ const address = '0x2791bca1f2de4661ed88a30c99a7a9449aa84174'
+
+ const usdc = new ethers.Contract(address, abi)
+
+ const usdSymbol = await usdc.symbol()
+ appendConsoleLine(`Token symbol: ${usdSymbol}`)
+
+ const balance = await usdc.balanceOf(await signer.getAddress())
+ appendConsoleLine(`Token Balance: ${balance.toString()}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const fetchTokenBalances = async () => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ const signer = wallet.getSigner()
+ const accountAddress = await signer.getAddress()
+ const networks = await wallet.getNetworks()
+ const network = networks.find(network => network.chainId === ChainId.POLYGON)
+
+ if (!network) {
+ throw new Error(`Could not find Polygon network in networks list`)
+ }
+
+ const indexer = new sequence.indexer.SequenceIndexer(network.indexerUrl)
+
+ const tokenBalances = await indexer.getTokenBalances({
+ accountAddress: accountAddress,
+ includeMetadata: true
+ })
+
+ appendConsoleLine(`tokens in your account: ${JSON.stringify(tokenBalances)}`)
+
+ // NOTE: you can put any NFT/collectible address in the `contractAddress` field and it will return all of the balances + metadata.
+ // We use the Skyweaver production contract address here for demo purposes, but try another one :)
+ const skyweaverCollectibles = await indexer.getTokenBalances({
+ accountAddress: accountAddress,
+ includeMetadata: true,
+ contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'
+ })
+ appendConsoleLine(`skyweaver collectibles in your account: ${JSON.stringify(skyweaverCollectibles)}`)
+
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const updateImplementation = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ data: new ethers.Interface(walletContracts.mainModule.abi).encodeFunctionData('updateImplementation', [
+ ethers.ZeroAddress
+ ])
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const updateImageHash = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ data: new ethers.Interface(walletContracts.mainModuleUpgradable.abi).encodeFunctionData('updateImageHash', [
+ ethers.ZeroHash
+ ])
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const delegateCall = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ delegateCall: true
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const addHook = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ data: new ethers.Interface(['function addHook(bytes4 _signature, address _implementation)']).encodeFunctionData(
+ 'addHook',
+ ['0x01234567', ethers.ZeroAddress]
+ )
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const setExtraImageHash = async (signer?: sequence.provider.SequenceSigner) => {
+ try {
+ resetConsole()
+
+ const wallet = sequence.getWallet()
+
+ signer = signer || wallet.getSigner() // select DefaultChain signer by default
+
+ const transaction: sequence.transactions.Transaction = {
+ to: wallet.getAddress(),
+ data: new ethers.Interface(['function setExtraImageHash(bytes32 _imageHash, uint256 _expiration)']).encodeFunctionData(
+ 'setExtraImageHash',
+ [ethers.ZeroHash, ethers.MaxUint256]
+ )
+ }
+
+ const response = await signer.sendTransaction(transaction)
+ appendConsoleLine(`response: ${JSON.stringify(response)}`)
+ setConsoleLoading(false)
+ } catch (e) {
+ console.error(e)
+ consoleErrorMessage()
+ }
+ }
+
+ const appendConsoleLine = (message: string, clear = false) => {
+ console.log(message)
+
+ if (clear) {
+ return setConsoleMsg(message)
+ }
+
+ return setConsoleMsg(prevState => {
+ return `${prevState}\n\n${message}`
+ })
+ }
+
+ const resetConsole = () => {
+ setConsoleLoading(true)
+ }
+
+ const consoleWelcomeMessage = () => {
+ setConsoleLoading(false)
+
+ if (isWalletConnected) {
+ setConsoleMsg('Status: Wallet is connected :)')
+ } else {
+ setConsoleMsg('Status: Wallet not connected. Please connect wallet first.')
+ }
+ }
+
+ const consoleErrorMessage = () => {
+ setConsoleLoading(false)
+ setConsoleMsg('An error occurred')
+ }
+
+ // networks list, filtered and sorted
+ const omitNetworks = [
+ ChainId.RINKEBY,
+ ChainId.HARDHAT,
+ ChainId.HARDHAT_2,
+ ChainId.KOVAN,
+ ChainId.ROPSTEN,
+ ChainId.HOMEVERSE_TESTNET,
+ ChainId.BASE_GOERLI
+ ]
+
+ const mainnets = Object.values(sequence.network.networks)
+ .filter(network => network.type === NetworkType.MAINNET)
+ .sort((a, b) => a.chainId - b.chainId)
+ const testnets = Object.values(sequence.network.networks)
+ .filter(network => network.type === NetworkType.TESTNET)
+ .sort((a, b) => a.chainId - b.chainId)
+ const networks = [...mainnets, ...testnets].filter(network => !network.deprecated && !omitNetworks.includes(network.chainId))
+
+ useEffect(() => {
+ if (email && !isOpen) {
+ console.log(email)
+ connect({
+ app: 'Demo Dapp',
+ authorize: true,
+ settings: {
+ // Specify signInWithEmail with an email address to allow user automatically sign in with the email option.
+ signInWithEmail: email,
+ theme: 'dark',
+ bannerUrl: `${window.location.origin}${skyweaverBannerUrl}`
+ }
+ })
+ setEmail(null)
+ }
+ }, [email, isOpen])
+
+ const sanitizeEmail = (email: string) => {
+ // Trim unnecessary spaces
+ email = email.trim()
+
+ // Check if the email matches the pattern of a typical email
+ const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/
+ if (emailRegex.test(email)) {
+ return true
+ }
+
+ return false
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+ Demo Dapp
+
+
+
+
+
+ A dapp example on how to use the Sequence Wallet. This covers how to connect, sign messages and send transctions.
+
+
+
+
+
+
+ Please open your browser dev inspector to view output of functions below.
+
+
+
+
+
+ {!isCustom && (
+
+
+ )}
+
+
+
+ Wallet URL
+
+
+
+
+ {walletAppURL}
+
+
+
+
+
+
+
+
+
+ Project Access Key
+
+
+
+
+ {projectAccessKey}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ openWallet()} label="Open Wallet" />
+ openWalletWithSettings()}
+ label="Open Wallet with Settings"
+ />
+ closeWallet()} label="Close Wallet" />
+ isConnected()} label="Is Connected?" />
+ isOpened()} label="Is Opened?" />
+
+
+
+ getChainID()} label="ChainID" />
+ getNetworks()} label="Networks" />
+ getAccounts()} label="Get Accounts" />
+ getBalance()} label="Get Balance" />
+
+
+
+ signMessageString()}
+ label="Sign Message"
+ />
+ signMessageHex()}
+ label="Sign Message (Hex)"
+ />
+ signMessageBytes()}
+ label="Sign Message (Bytes)"
+ />
+ signTypedData()}
+ label="Sign TypedData"
+ />
+
+
+
+ estimateUnwrapGas()}
+ label="Estimate Unwrap Gas"
+ />
+
+
+
+ sendETH()} label="Send funds" />
+ sendETHSidechain()} label="Send on L2" />
+ sendDAI()} label="Send DAI" />
+ send1155Tokens()}
+ label="Send ERC-1155 Tokens"
+ />
+ sendSepoliaUSDC()}
+ label="Send USDC on Sepolia"
+ />
+
+
+
+ contractExample()}
+ label="Read Symbol and Balance"
+ />
+ fetchTokenBalances()}
+ label="Fetch Token Balances"
+ />
+
+
+ {showProhibitedActions && (
+
+ updateImplementation()}
+ label="Update Implementation"
+ />
+ updateImageHash()}
+ label="Update Image Hash"
+ />
+ delegateCall()}
+ label="Delegate Call"
+ />
+ addHook()} label="Add Hook" />
+ setExtraImageHash()}
+ label="Set Extra Image Hash"
+ />
+
+ )}
+
+
+ {isOpen && (
+ toggleModal(false)} size={'sm'}>
+
+
+
+
+ Auto-email login, please specify the email address
+
+
+
+ } }) => {
+ setEmail(ev.target.value)
+ }}
+ >
+
+ {warning ? (
+
+
+ please input an email with correct format
+
+
+ ) : null}
+
+ {
+ if (sanitizeEmail(email)) {
+ setWarning(false)
+ toggleModal(false)
+ } else {
+ setWarning(true)
+ }
+ }}
+ data-id="login"
+ />
+
+
+
+
+ )}
+
+
+
+ )
+}
+
+export default React.memo(App)
diff --git a/.codesandbox/src/README.md b/.codesandbox/src/README.md
new file mode 100644
index 000000000..53e2cf116
--- /dev/null
+++ b/.codesandbox/src/README.md
@@ -0,0 +1,49 @@
+Demo Dapp
+=========
+
+Dapp example on how to use Sequence Wallet. Covers how to connect, sign messages and send transctions.
+
+Try this dapp at: [https://0xsequence.github.io/demo-dapp](https://0xsequence.github.io/demo-dapp)
+
+For complete documentation on Sequence, please see: [https://docs.sequence.build](https://docs.sequence.build)
+
+## Usage
+
+1. pnpm install
+2. pnpm dev
+3. Open browser to http://localhost:4000 to access the demo dapp
+4. Open browser inspector to see responses from the remote Sequence Wallet
+
+## Development
+
+See https://github.com/0xsequence/demo-dapp/blob/master/src/routes/HomeRoute.tsx for the source
+usage for a variety of functions. be sure t open your browser's dev inspector to see output.
+Think of these functions as a "cookbook" for how you can perform these functions in your dapps.
+
+Also note, sequence.js is built on top of ethers.js, and is API-compatible.
+
+## Screenshots
+
+**Opening wallet from dapp:**
+
+
+
+
+**Send transaction from dapp:**
+
+Sequence Wallet is an Ethereum wallet supporting Ethereum mainnet, Polygon and more. Sequence will work
+with any blockchain which is EVM compatible and supports Ethereum's node JSON-RPC interface.
+
+Here you can see in this screenshot the call to "Send DAI" from demo-dapp
+(https://github.com/0xsequence/demo-dapp/blob/master/src/routes/HomeRoute.tsx#L420). This function demonstrates
+how you can transfer an ERC-20 token like DAI on any Ethereum network.
+
+Notice how you can pay gas fees for a transaction in either MATIC token or USDC for price of $0.01.
+
+
+
+
+
+## LICENSE
+
+Apache 2.0 or MIT (your choice)
diff --git a/.codesandbox/src/components/Console/index.tsx b/.codesandbox/src/components/Console/index.tsx
new file mode 100644
index 000000000..ccc41c280
--- /dev/null
+++ b/.codesandbox/src/components/Console/index.tsx
@@ -0,0 +1,37 @@
+import { Box, Collapsible } from '@0xsequence/design-system'
+
+import * as styles from './styles.css'
+
+export interface ConsoleProps {
+ message: string | null
+ loading: boolean
+}
+
+export const Console = ({ message, loading }: ConsoleProps) => {
+ const getLoadingDots = () => {
+ if (message) {
+ return '\n...'
+ }
+ return '...'
+ }
+
+ return (
+
+
+ {message}
+ {loading && getLoadingDots()}
+ {
+
+ _
+
+ }
+
+
+ )
+}
diff --git a/.codesandbox/src/components/Console/styles.css.ts b/.codesandbox/src/components/Console/styles.css.ts
new file mode 100644
index 000000000..ee034562a
--- /dev/null
+++ b/.codesandbox/src/components/Console/styles.css.ts
@@ -0,0 +1,11 @@
+import { style, keyframes } from '@vanilla-extract/css'
+
+export const blink = keyframes({
+ '0%': { visibility: 'hidden' },
+ '50%': { visibility: 'hidden' },
+ '100%': {visibility: 'visible' }
+})
+
+export const cursor = style({
+ animation: `${blink} 2s infinite`,
+})
\ No newline at end of file
diff --git a/.codesandbox/src/components/Group/index.tsx b/.codesandbox/src/components/Group/index.tsx
new file mode 100644
index 000000000..c0edc223d
--- /dev/null
+++ b/.codesandbox/src/components/Group/index.tsx
@@ -0,0 +1,42 @@
+import React from 'react'
+import { Box, Text } from '@0xsequence/design-system'
+
+import * as styles from './styles.css'
+
+interface GroupProps {
+ label?: JSX.Element | string
+ children: React.ReactNode
+ style?: any
+ className?: string
+}
+
+export const Group = (props: GroupProps) => {
+ const { label, children, style, className } = props
+
+ return (
+
+ {label && (
+
+ {label}
+
+ )}
+
+ {React.Children.map(children, (child, i) => (
+ {child}
+ ))}
+
+
+ )
+}
+
+interface GroupTitleProps {
+ children?: React.ReactNode
+}
+
+export const GroupTitle = (props: GroupTitleProps) => {
+ return (
+
+ {props.children}
+
+ )
+}
diff --git a/.codesandbox/src/components/Group/styles.css.ts b/.codesandbox/src/components/Group/styles.css.ts
new file mode 100644
index 000000000..7ade6562e
--- /dev/null
+++ b/.codesandbox/src/components/Group/styles.css.ts
@@ -0,0 +1,17 @@
+import { vars, responsiveStyle } from '@0xsequence/design-system'
+import { style } from '@vanilla-extract/css'
+
+export const groupItems = style({
+ display: 'grid',
+ gridColumnGap: vars.space[2],
+ gridRowGap: vars.space[2],
+ gridTemplateColumns: 'repeat(1, minmax(0, 1fr))',
+ '@media': responsiveStyle({
+ lg: {
+ gridTemplateColumns: 'repeat(2, minmax(0, 1fr))'
+ },
+ xl: {
+ gridTemplateColumns: 'repeat(3, minmax(0, 1fr))'
+ }
+ })
+})
diff --git a/.codesandbox/src/constants/abi.ts b/.codesandbox/src/constants/abi.ts
new file mode 100644
index 000000000..d18bf898e
--- /dev/null
+++ b/.codesandbox/src/constants/abi.ts
@@ -0,0 +1,64 @@
+export const ERC_1155_ABI = [
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: '_from',
+ type: 'address'
+ },
+ {
+ internalType: 'address',
+ name: '_to',
+ type: 'address'
+ },
+ {
+ internalType: 'uint256[]',
+ name: '_ids',
+ type: 'uint256[]'
+ },
+ {
+ internalType: 'uint256[]',
+ name: '_amounts',
+ type: 'uint256[]'
+ },
+ {
+ internalType: 'bytes',
+ name: '_data',
+ type: 'bytes'
+ }
+ ],
+ name: 'safeBatchTransferFrom',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function'
+ }
+]
+
+export const ERC_20_ABI = [
+ {
+ constant: false,
+ inputs: [
+ {
+ internalType: 'address',
+ name: 'recipient',
+ type: 'address'
+ },
+ {
+ internalType: 'uint256',
+ name: 'amount',
+ type: 'uint256'
+ }
+ ],
+ name: 'transfer',
+ outputs: [
+ {
+ internalType: 'bool',
+ name: '',
+ type: 'bool'
+ }
+ ],
+ payable: false,
+ stateMutability: 'nonpayable',
+ type: 'function'
+ }
+]
diff --git a/.codesandbox/src/helpers.ts b/.codesandbox/src/helpers.ts
new file mode 100644
index 000000000..6faad9885
--- /dev/null
+++ b/.codesandbox/src/helpers.ts
@@ -0,0 +1,17 @@
+export const getDefaultChainId = () => {
+ const chainId = window.localStorage.getItem('defaultChainId')
+ if (chainId === null || chainId === undefined) {
+ return null
+ } else {
+ return Number(chainId)
+ }
+}
+
+export const saveDefaultChainId = (chainId: number) => {
+ console.log('huh?', chainId)
+ window.localStorage.setItem('defaultChainId', `${chainId}`)
+}
+
+export const toHexString = (value: bigint) => {
+ return '0x' + value.toString(16)
+}
diff --git a/.codesandbox/src/images/logo.svg b/.codesandbox/src/images/logo.svg
new file mode 100644
index 000000000..2d6fca588
--- /dev/null
+++ b/.codesandbox/src/images/logo.svg
@@ -0,0 +1,61 @@
+
diff --git a/.codesandbox/src/images/skyweaver-banner-large.png b/.codesandbox/src/images/skyweaver-banner-large.png
new file mode 100644
index 000000000..c536a9710
Binary files /dev/null and b/.codesandbox/src/images/skyweaver-banner-large.png differ
diff --git a/.codesandbox/src/images/skyweaver-banner.old.png b/.codesandbox/src/images/skyweaver-banner.old.png
new file mode 100644
index 000000000..85b65fcf0
Binary files /dev/null and b/.codesandbox/src/images/skyweaver-banner.old.png differ
diff --git a/.codesandbox/src/images/skyweaver-banner.png b/.codesandbox/src/images/skyweaver-banner.png
new file mode 100644
index 000000000..635632921
Binary files /dev/null and b/.codesandbox/src/images/skyweaver-banner.png differ
diff --git a/.codesandbox/src/index.css b/.codesandbox/src/index.css
new file mode 100644
index 000000000..4d357aa16
--- /dev/null
+++ b/.codesandbox/src/index.css
@@ -0,0 +1,9 @@
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+body {
+ background: var(--seq-colors-background-primary);
+}
diff --git a/.codesandbox/src/index.tsx b/.codesandbox/src/index.tsx
new file mode 100644
index 000000000..05fa3617c
--- /dev/null
+++ b/.codesandbox/src/index.tsx
@@ -0,0 +1,17 @@
+import './index.css'
+import '@0xsequence/design-system/styles.css'
+
+import { ThemeProvider } from '@0xsequence/design-system'
+import React from 'react'
+import { createRoot } from 'react-dom/client'
+import App from './App'
+
+const root = createRoot(document.getElementById('root'))
+
+root.render(
+
+
+
+
+
+)
diff --git a/.codesandbox/src/react-app-env.d.ts b/.codesandbox/src/react-app-env.d.ts
new file mode 100644
index 000000000..6431bc5fc
--- /dev/null
+++ b/.codesandbox/src/react-app-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/.codesandbox/src/vite-env.d.ts b/.codesandbox/src/vite-env.d.ts
new file mode 100644
index 000000000..11f02fe2a
--- /dev/null
+++ b/.codesandbox/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/.codesandbox/tasks.json b/.codesandbox/tasks.json
new file mode 100644
index 000000000..5be606cdf
--- /dev/null
+++ b/.codesandbox/tasks.json
@@ -0,0 +1,118 @@
+{
+ // These tasks will run in order when initializing your CodeSandbox project.
+ "setupTasks": [
+ {
+ "name": "Install Dependencies",
+ "command": "pnpm install"
+ }
+ ],
+
+ // These tasks can be run from CodeSandbox. Running one will open a log in the app.
+ "tasks": {
+ "build": {
+ "name": "build",
+ "command": "pnpm build",
+ "runAtStart": false
+ },
+ "watch": {
+ "name": "watch",
+ "command": "pnpm watch",
+ "runAtStart": false
+ },
+ "clean": {
+ "name": "clean",
+ "command": "pnpm clean",
+ "runAtStart": false
+ },
+ "changeset": {
+ "name": "changeset",
+ "command": "pnpm changeset",
+ "runAtStart": false
+ },
+ "version-packages": {
+ "name": "version-packages",
+ "command": "pnpm version-packages",
+ "runAtStart": false
+ },
+ "release": {
+ "name": "release",
+ "command": "pnpm release",
+ "runAtStart": false
+ },
+ "snapshot": {
+ "name": "snapshot",
+ "command": "pnpm snapshot",
+ "runAtStart": false
+ },
+ "update-version": {
+ "name": "update-version",
+ "command": "pnpm update-version",
+ "runAtStart": false
+ },
+ "test": {
+ "name": "test",
+ "command": "pnpm test",
+ "runAtStart": false
+ },
+ "test:parallel": {
+ "name": "test:parallel",
+ "command": "pnpm test:parallel",
+ "runAtStart": false
+ },
+ "lint": {
+ "name": "lint",
+ "command": "pnpm lint",
+ "runAtStart": false
+ },
+ "lint:fix": {
+ "name": "lint:fix",
+ "command": "pnpm lint:fix",
+ "runAtStart": false
+ },
+ "lint:tests": {
+ "name": "lint:tests",
+ "command": "pnpm lint:tests",
+ "runAtStart": false
+ },
+ "lint:tests:fix": {
+ "name": "lint:tests:fix",
+ "command": "pnpm lint:tests:fix",
+ "runAtStart": false
+ },
+ "format": {
+ "name": "format",
+ "command": "pnpm format",
+ "runAtStart": false
+ },
+ "audit:fix": {
+ "name": "audit:fix",
+ "command": "pnpm audit:fix",
+ "runAtStart": false
+ },
+ "typecheck": {
+ "name": "typecheck",
+ "command": "pnpm typecheck",
+ "runAtStart": false
+ },
+ "dev": {
+ "name": "dev",
+ "command": "pnpm dev",
+ "runAtStart": true
+ },
+ "postinstall": {
+ "name": "postinstall",
+ "command": "pnpm postinstall",
+ "runAtStart": false
+ },
+ "coverage": {
+ "name": "coverage",
+ "command": "pnpm coverage",
+ "runAtStart": false
+ },
+ "prepare": {
+ "name": "prepare",
+ "command": "pnpm prepare",
+ "runAtStart": false
+ }
+ }
+}
diff --git a/.codesandbox/tsconfig.json b/.codesandbox/tsconfig.json
new file mode 100644
index 000000000..6f3e83f21
--- /dev/null
+++ b/.codesandbox/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "types": ["vite/client", "vite-plugin-svgr/client"],
+ },
+ "include": [
+ "src"
+ ]
+}
diff --git a/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB b/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB
new file mode 100644
index 000000000..0b31b7584
Binary files /dev/null and b/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB differ
diff --git a/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB b/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB
new file mode 100644
index 000000000..5e6ea312b
Binary files /dev/null and b/.codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB differ
diff --git a/.codesandbox/vite.config.ts b/.codesandbox/vite.config.ts
new file mode 100644
index 000000000..5c41a802d
--- /dev/null
+++ b/.codesandbox/vite.config.ts
@@ -0,0 +1,21 @@
+import { defineConfig } from 'vite'
+import dns from 'dns'
+import react from '@vitejs/plugin-react'
+import viteTsconfigPaths from 'vite-tsconfig-paths'
+import svgrPlugin from 'vite-plugin-svgr'
+import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'
+
+dns.setDefaultResultOrder('verbatim')
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react(), viteTsconfigPaths(), svgrPlugin(), vanillaExtractPlugin()],
+ server: {
+ port: 4000,
+ fs: {
+ // Allow serving files from one level up to the project root
+ allow: ['..']
+ }
+ },
+ base: '/demo-dapp'
+})
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 000000000..849dc677d
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,2 @@
+.eslintrc.js
+packages/**/dist
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 000000000..d4366e425
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,48 @@
+const { off } = require("process")
+
+module.exports = {
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ ecmaVersion: 2018,
+ sourceType: 'module'
+ },
+
+ extends: [
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:import/errors',
+ 'plugin:import/warnings',
+ 'plugin:import/typescript',
+ 'prettier'
+ ],
+
+ rules: {
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ '@typescript-eslint/ban-types': 'off',
+ '@typescript-eslint/ban-ts-comment': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/no-inferrable-types': 'off',
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-this-alias': 'off',
+
+ 'import/no-unresolved': 'off',
+ 'import/no-default-export': 2,
+ 'import/no-named-as-default-member': 'off',
+ 'import/export': 'off'
+
+
+ // 'import/order': [
+ // 'warn',
+ // {
+ // 'groups': ['builtin', 'external', 'parent', 'sibling', 'index'],
+ // 'alphabetize': {
+ // 'order': 'asc', /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */
+ // 'caseInsensitive': true /* ignore case. Options: [true, false] */
+ // }
+ // },
+ // ]
+
+ }
+}
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..6df386ae9
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,40 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: 'bug'
+assignees: ''
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Desktop (please complete the following information):**
+
+- OS: [e.g. iOS]
+- Browser [e.g. chrome, safari]
+- Version [e.g. 22]
+
+**Smartphone (please complete the following information):**
+
+- Device: [e.g. iPhone6]
+- OS: [e.g. iOS8.1]
+- Browser [e.g. stock browser, safari]
+- Version [e.g. 22]
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md
new file mode 100644
index 000000000..96a47352a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/custom.md
@@ -0,0 +1,7 @@
+---
+name: Custom issue template
+about: Describe this issue template's purpose here.
+title: ''
+labels: ''
+assignees: ''
+---
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..104f39199
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,19 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: 'enhancement'
+assignees: ''
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml
index ca81d1a40..c354c156b 100644
--- a/.github/actions/install-dependencies/action.yml
+++ b/.github/actions/install-dependencies/action.yml
@@ -4,15 +4,10 @@ runs:
using: 'composite'
steps:
- - name: Setup Node
- uses: actions/setup-node@v4
- with:
- node-version: 20
-
- name: Setup PNPM
- uses: pnpm/action-setup@v3
+ uses: pnpm/action-setup@v2
with:
- version: 10
+ version: 8
run_install: false
- name: Get pnpm store directory
@@ -22,7 +17,7 @@ runs:
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
- uses: actions/cache@v4
+ uses: actions/cache@v3
with:
path: |
${{ steps.pnpm-cache.outputs.STORE_PATH }}
@@ -33,6 +28,11 @@ runs:
restore-keys: |
${{ runner.os }}-pnpm-store-
+ - name: Setup Node
+ uses: actions/setup-node@v3
+ with:
+ node-version: 20
+
- name: Install dependencies
shell: bash
run: pnpm install --frozen-lockfile
diff --git a/.github/workflows/publish-dists.yml b/.github/workflows/Publish-Dists.yml
similarity index 89%
rename from .github/workflows/publish-dists.yml
rename to .github/workflows/Publish-Dists.yml
index fd4bb7905..87724480b 100644
--- a/.github/workflows/publish-dists.yml
+++ b/.github/workflows/Publish-Dists.yml
@@ -30,9 +30,8 @@ jobs:
echo "📦 Publishing $PACKAGE to $BRANCH"
- mkdir -p /tmp/$PACKAGE
- shopt -s dotglob
- cp -r $PKG_DIR/* /tmp/$PACKAGE || true
+ mkdir -p "/tmp/$PACKAGE"
+ cp -r "$PKG_DIR"/. "/tmp/$PACKAGE" || true
cd /tmp/$PACKAGE
git init
@@ -74,7 +73,11 @@ jobs:
}
};
- rewrite(pkg.dependencies);
+ ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].forEach((field) => {
+ if (pkg[field]) {
+ rewrite(pkg[field]);
+ }
+ });
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
'
diff --git a/.github/workflows/fortify.yml b/.github/workflows/fortify.yml
new file mode 100644
index 000000000..ff1a25baf
--- /dev/null
+++ b/.github/workflows/fortify.yml
@@ -0,0 +1,85 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+################################################################################################################################################
+# Fortify Application Security provides your team with solutions to empower DevSecOps practices, enable cloud transformation, and secure your #
+# software supply chain. To learn more about Fortify, start a free trial or contact our sales team, visit fortify.com. #
+# #
+# Use this starter workflow as a basis for integrating Fortify Application Security Testing into your GitHub workflows. This template #
+# demonstrates the steps to package the code+dependencies, initiate a scan, and optionally import SAST vulnerabilities into GitHub Security #
+# Code Scanning Alerts. Additional information is available in the workflow comments and the Fortify AST Action / fcli / Fortify product #
+# documentation. If you need additional assistance, please contact Fortify support. #
+################################################################################################################################################
+
+name: Fortify AST Scan
+
+# Customize trigger events based on your DevSecOps process and/or policy
+on:
+ push:
+ branches: [ "master" ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ "master" ]
+ schedule:
+ - cron: '31 12 * * 4'
+ workflow_dispatch:
+
+jobs:
+ Fortify-AST-Scan:
+ # Use the appropriate runner for building your source code. Ensure dev tools required to build your code are present and configured appropriately (MSBuild, Python, etc).
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+ steps:
+ # Check out source code
+ - name: Check Out Source Code
+ uses: actions/checkout@v4
+
+ # Java is required to run the various Fortify utilities. Ensuring proper version is installed on the runner.
+ - name: Setup Java
+ uses: actions/setup-java@v4
+ with:
+ java-version: 17
+ distribution: 'temurin'
+
+ # Perform SAST and optionally SCA scan via Fortify on Demand/Fortify Hosted/Software Security Center, then
+ # optionally export SAST results to the GitHub code scanning dashboard. In case further customization is
+ # required, you can use sub-actions like fortify/github-action/setup@v1 to set up the various Fortify tools
+ # and run them directly from within your pipeline; see https://github.com/fortify/github-action#readme for
+ # details.
+
+ - name: Run FoD SAST Scan
+ uses: fortify/github-action@a92347297e02391b857e7015792cd1926a4cd418
+ with:
+ sast-scan: true
+ env:
+ ### Required configuration when integrating with Fortify on Demand
+ FOD_URL: https://ams.fortify.com
+ FOD_TENANT: ${{secrets.FOD_TENANT}}
+ FOD_USER: ${{secrets.FOD_USER}}
+ FOD_PASSWORD: ${{secrets.FOD_PAT}}
+ ### Optional configuration when integrating with Fortify on Demand
+ # EXTRA_PACKAGE_OPTS: -oss # Extra 'scancentral package' options, like '-oss'' if
+ # Debricked SCA scan is enabled on Fortify on Demand
+ # EXTRA_FOD_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli fod session login' options
+ # FOD_RELEASE: MyApp:MyRelease # FoD release name, default: /:; may
+ # replace app+release name with numeric release ID
+ # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true'
+ # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard
+ ### Required configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral
+ # SSC_URL: ${{secrets.SSC_URL}} # SSC URL
+ # SSC_TOKEN: ${{secrets.SSC_TOKEN}} # SSC CIToken or AutomationToken
+ # SC_SAST_TOKEN: ${{secrets.SC_SAST_TOKEN}} # ScanCentral SAST client auth token
+ # SC_SAST_SENSOR_VERSION: ${{vars.SC_SAST_SENSOR_VERSION}} # Sensor version on which to run the scan;
+ # usually defined as organization or repo variable
+ ### Optional configuration when integrating with Fortify Hosted / Software Security Center & ScanCentral
+ # EXTRA_SC_SAST_LOGIN_OPTS: --socket-timeout=60s # Extra 'fcli sc-sast session login' options
+ # SSC_APPVERSION: MyApp:MyVersion # SSC application version, default: /:
+ # EXTRA_PACKAGE_OPTS: -bv myCustomPom.xml # Extra 'scancentral package' options
+ # DO_WAIT: true # Wait for scan completion, implied if 'DO_EXPORT: true'
+ # DO_EXPORT: true # Export SAST results to GitHub code scanning dashboard
diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml
new file mode 100644
index 000000000..974fcb999
--- /dev/null
+++ b/.github/workflows/nextjs.yml
@@ -0,0 +1,93 @@
+# Sample workflow for building and deploying a Next.js site to GitHub Pages
+#
+# To get started with Next.js see: https://nextjs.org/docs/getting-started
+#
+name: Deploy Next.js site to Pages
+
+on:
+ # Runs on pushes targeting the default branch
+ push:
+ branches: ["master"]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+jobs:
+ # Build job
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Detect package manager
+ id: detect-package-manager
+ run: |
+ if [ -f "${{ github.workspace }}/yarn.lock" ]; then
+ echo "manager=yarn" >> $GITHUB_OUTPUT
+ echo "command=install" >> $GITHUB_OUTPUT
+ echo "runner=yarn" >> $GITHUB_OUTPUT
+ exit 0
+ elif [ -f "${{ github.workspace }}/package.json" ]; then
+ echo "manager=npm" >> $GITHUB_OUTPUT
+ echo "command=ci" >> $GITHUB_OUTPUT
+ echo "runner=npx --no-install" >> $GITHUB_OUTPUT
+ exit 0
+ else
+ echo "Unable to determine package manager"
+ exit 1
+ fi
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: "20"
+ cache: ${{ steps.detect-package-manager.outputs.manager }}
+ - name: Setup Pages
+ uses: actions/configure-pages@v5
+ with:
+ # Automatically inject basePath in your Next.js configuration file and disable
+ # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized).
+ #
+ # You may remove this line if you want to manage the configuration yourself.
+ static_site_generator: next
+ - name: Restore cache
+ uses: actions/cache@v4
+ with:
+ path: |
+ .next/cache
+ # Generate a new cache whenever packages or source files change.
+ key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
+ # If source files changed but packages didn't, rebuild from a prior cache.
+ restore-keys: |
+ ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-
+ - name: Install dependencies
+ run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }}
+ - name: Build with Next.js
+ run: ${{ steps.detect-package-manager.outputs.runner }} next build
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: ./out
+
+ # Deployment job
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.github/workflows/on_pr_pnpm-format-label.yml b/.github/workflows/on_pr_pnpm-format-label.yml
index 84fb27cb3..b9dda862b 100644
--- a/.github/workflows/on_pr_pnpm-format-label.yml
+++ b/.github/workflows/on_pr_pnpm-format-label.yml
@@ -12,6 +12,9 @@ jobs:
rm:
if: ${{ github.event.label.name == 'pnpm format' }}
+ permissions:
+ contents: read
+ issues: write
runs-on: ubuntu-latest
steps:
- name: Remove the label
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 62fc357db..4bc0c4d29 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -1,6 +1,8 @@
on: [push]
name: tests
+permissions:
+ contents: read
jobs:
install:
@@ -31,8 +33,9 @@ jobs:
uses: foundry-rs/foundry-toolchain@v1
with:
version: nightly
+ # Fork latest mainnet state
- name: Start Anvil in background
- run: anvil --fork-url https://nodes.sequence.app/arbitrum &
+ run: anvil --fork-url https://reth-ethereum.ithaca.xyz/nodes.sequence.app/rpc &
- run: pnpm test
# NOTE: if you'd like to see example of how to run
diff --git a/.github/workflows/web-sdk.yml b/.github/workflows/web-sdk.yml
new file mode 100644
index 000000000..e7253f1e3
--- /dev/null
+++ b/.github/workflows/web-sdk.yml
@@ -0,0 +1,137 @@
+name: Web-SDK
+on:
+ pull_request:
+ branches:
+ - master
+ - main
+ push:
+ branches:
+ - master
+ - main
+
+jobs:
+ master:
+ if: "! startsWith(github.event.head_commit.message, '[CI Skip]')"
+ runs-on: ubuntu-22.04
+ name: Build and Deploy
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ - name: Web-SDK
+ uses: actions/setup-node@v3
+ with:
+ node-version: '18''20''22'
+ cache: 'yarn''npm''pnpm'
+ - name: Web SDK
+ id: Install the Web SDK dependencies
+ run: |
+ npm install @0xsequence/connect @0xsequence/hooks wagmi ethers viem 0xsequence @tanstack/react-query
+ # or
+ pnpm install @0xsequence/connect @0xsequence/hooks wagmi ethers viem 0xsequence @tanstack/react-query
+ # or
+ yarn add @0xsequence/connect @0xsequence/hooks wagmi ethers viem 0xsequence @tanstack/react-query
+
+ # === Deploy static pages ===
+ - name: Deploy to Cloudflare Pages
+ id: cloudflare_deployment
+ uses: cloudflare/pages-action@v1
+ with:
+ apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+ accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
+ projectName: 'w3o'
+ gitHubToken: ${{ secrets.GH_AUTOMATION_TOKEN }}
+ branch: 'main'
+ directory: './packages/demo/build'
+ wranglerVersion: '3'
+
+# Sample workflow for building and deploying a Next.js site to GitHub Pages
+#
+# To get started with Next.js see: https://nextjs.org/docs/getting-started
+#
+# Runs on pushes targeting the default branch
+ push:
+ branches: ["master"]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+jobs:
+ # Build job
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Detect package manager
+ id: detect-package-manager
+ run: |
+ if [ -f "${{ github.workspace }}/yarn.lock" ]; then
+ echo "manager=yarn" >> $GITHUB_OUTPUT
+ echo "command=install" >> $GITHUB_OUTPUT
+ echo "runner=yarn" >> $GITHUB_OUTPUT
+ exit 0
+ elif [ -f "${{ github.workspace }}/package.json" ]; then
+ echo "manager=npm" >> $GITHUB_OUTPUT
+ echo "command=ci" >> $GITHUB_OUTPUT
+ echo "runner=npx --no-install" >> $GITHUB_OUTPUT
+ exit 0
+ else
+ echo "Unable to determine package manager"
+ exit 1
+ fi
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: "20"
+ cache: ${{ steps.detect-package-manager.outputs.manager }}
+ - name: Setup Pages
+ uses: actions/configure-pages@v5
+ with:
+ # Automatically inject basePath in your Next.js configuration file and disable
+ # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized).
+ #
+ # You may remove this line if you want to manage the configuration yourself.
+ static_site_generator: next
+ - name: Restore cache
+ uses: actions/cache@v4
+ with:
+ path: |
+ .next/cache
+ # Generate a new cache whenever packages or source files change.
+ key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
+ # If source files changed but packages didn't, rebuild from a prior cache.
+ restore-keys: |
+ ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-
+ - name: Install dependencies
+ run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }}
+ - name: Build with Next.js
+ run: ${{ steps.detect-package-manager.outputs.runner }} next build
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: ./out
+
+ # Deployment job
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..4e690ff7d
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,54 @@
+[submodule "lib/solady"]
+ path = lib/solady
+ url = https://github.com/vectorized/solady
+[submodule "counter/lib/forge-std"]
+ path = counter/lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "Counter/lib/forge-std"]
+ path = Counter/lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "dependencies/v4-core"]
+ path = dependencies/v4-core
+ url = https://github.com/uniswap/v4-core
+[submodule "dependencies/v4-periphery"]
+ path = dependencies/v4-periphery
+ url = https://github.com/Uniswap/v4-periphery
+[submodule "dependencies/permit2"]
+ path = dependencies/permit2
+ url = https://github.com/uniswap/permit2
+[submodule "dependencies/universal-router"]
+ path = dependencies/universal-router
+ url = https://github.com/uniswap/universal-router
+[submodule "dependencies/v3-core"]
+ path = dependencies/v3-core
+ url = https://github.com/uniswap/v3-core
+[submodule "dependencies/v2-core"]
+ path = dependencies/v2-core
+ url = https://github.com/uniswap/v2-core
+[submodule "dependencies/openzeppelin-contracts"]
+ path = dependencies/openzeppelin-contracts
+ url = https://github.com/OpenZeppelin/openzeppelin-contracts
+[submodule "dependencies/signals-implicit-mode"]
+ path = dependencies/signals-implicit-mode
+ url = https://github.com/0xsequence/signals-implicit-mode
+[submodule "dependencies/solady"]
+ path = dependencies/solady
+ url = https://github.com/vectorized/solady
+[submodule "dependencies/forge-std"]
+ path = dependencies/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "dependencies/contracts-library"]
+ path = dependencies/contracts-library
+ url = https://github.com/Dargon789/contracts-library
+[submodule "lib/forge-std"]
+ path = lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "dependencies/ds-test"]
+ path = dependencies/ds-test
+ url = https://github.com/dapphub/ds-test
+[submodule "lib/signals-implicit-mode/lib/signals-implicit-mode"]
+ path = lib/signals-implicit-mode/lib/signals-implicit-mode
+ url = https://github.com/0xsequence/signals-implicit-mode
+[submodule "lib/signals-implicit-mode/lib/signals-implicit-mode"]
+ path = lib/signals-implicit-mode/lib/signals-implicit-mode
+ url = https://github.com/0xsequence/signals-implicit-mode
diff --git a/.nycrc b/.nycrc
new file mode 100644
index 000000000..9b547ac2d
--- /dev/null
+++ b/.nycrc
@@ -0,0 +1,26 @@
+{
+ "include": [
+ "packages/**/*.ts"
+ ],
+ "exclude": [
+ "**/*.d.ts",
+ "**/dist/*",
+ "**/tests/*",
+ "**/0xsequence/*"
+ ],
+ "extension": [
+ ".ts"
+ ],
+ "require": [
+ "ts-node/register",
+ "babel-core/register"
+ ],
+ "reporter": [
+ "html",
+ "text",
+ "lcov"
+ ],
+ "sourceMap": true,
+ "instrument": true,
+ "all": true
+}
diff --git a/CNAME b/CNAME
new file mode 100644
index 000000000..1889d9bae
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+sequence.app
diff --git a/FUNDING.json b/FUNDING.json
new file mode 100644
index 000000000..cb7bbaf78
--- /dev/null
+++ b/FUNDING.json
@@ -0,0 +1,10 @@
+{
+ "drips": {
+ "ethereum": {
+ "ownedBy": "0x9a72807e1BC8A5e1E178f51E26239d58F511EB3D"
+ }
+ },
+ "opRetro": {
+ "projectId": "0x62408999652f3bfa1be746d256bf5a4eb4719b993d40f07d2d60aaebee015018"
+ }
+}
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..c9a2fbd4c
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,20 @@
+# Security Policy
+
+## Supported Versions
+
+Use this section to tell people about which versions of your project are
+currently being supported with security updates.
+
+| Version | Supported |
+| ------- | ------------------ |
+| 5.1.x | :white_check_mark: |
+| 5.0.x | :x: |
+| 4.0.x | :white_check_mark: |
+| < 4.0 | :x: |
+
+## Reporting a Vulnerability
+
+Use this section to tell people how to report a vulnerability.
+
+To report a vulnerability, please email us at [dev@wevm.dev](mailto:dev@wevm.dev). We aim to provide an initial response within 48 hours and will keep you updated on the status of the reported vulnerability.
+
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
new file mode 100644
index 000000000..676233afa
--- /dev/null
+++ b/azure-pipelines.yml
@@ -0,0 +1,21 @@
+# Node.js
+# Build a general Node.js project with npm.
+# Add steps that analyze code, save build artifacts, deploy, and more:
+# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
+
+trigger:
+- master
+
+pool:
+ vmImage: ubuntu-latest
+
+steps:
+- task: NodeTool@0
+ inputs:
+ versionSpec: '10.x'
+ displayName: 'Install Node.js'
+
+- script: |
+ npm install
+ npm run build
+ displayName: 'npm install and build'
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 000000000..226b59df3
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,19 @@
+module.exports = {
+ presets: [
+ ['@babel/preset-env', {
+ targets: {
+ esmodules: true
+ },
+ bugfixes: true,
+ loose: true,
+ exclude: [
+ '@babel/plugin-transform-async-to-generator',
+ '@babel/plugin-transform-regenerator'
+ ]
+ }],
+ '@babel/preset-typescript'
+ ],
+ plugins: [
+ ['@babel/plugin-transform-class-properties', { loose: true }]
+ ]
+}
diff --git a/extras/docs/next-env.d.ts b/extras/docs/next-env.d.ts
new file mode 100644
index 000000000..830fb594c
--- /dev/null
+++ b/extras/docs/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/extras/docs/package.json b/extras/docs/package.json
index d88f6aab1..9873267da 100644
--- a/extras/docs/package.json
+++ b/extras/docs/package.json
@@ -13,7 +13,7 @@
},
"dependencies": {
"@repo/ui": "workspace:*",
- "next": "^15.4.7",
+ "next": "^15.4.8",
"react": "^19.1.0",
"react-dom": "^19.1.0"
},
diff --git a/extras/web/next-env.d.ts b/extras/web/next-env.d.ts
new file mode 100644
index 000000000..830fb594c
--- /dev/null
+++ b/extras/web/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/extras/web/package.json b/extras/web/package.json
index 8a0ffdf21..36fe0f51e 100644
--- a/extras/web/package.json
+++ b/extras/web/package.json
@@ -13,7 +13,7 @@
},
"dependencies": {
"@repo/ui": "workspace:*",
- "next": "^15.4.7",
+ "next": "^16.1.5",
"react": "^19.1.0",
"react-dom": "^19.1.0"
},
diff --git a/foundry.lock b/foundry.lock
new file mode 100644
index 000000000..66eebd704
--- /dev/null
+++ b/foundry.lock
@@ -0,0 +1,68 @@
+{
+ "Counter/lib/forge-std": {
+ "rev": "0768d9c08c085c79bb31d88683a78770764fec49"
+ },
+ "counter/lib/forge-std": {
+ "rev": "8bbcf6e3f8f62f419e5429a0bd89331c85c37824"
+ },
+ "dependencies/contracts-library": {
+ "rev": "8f278d8e55c26abe8d76cebd662c8f815cac2330"
+ },
+ "dependencies/ds-test": {
+ "rev": "e282159d5170298eb2455a6c05280ab5a73a4ef0"
+ },
+ "dependencies/forge-std": {
+ "tag": {
+ "name": "v1.14.0",
+ "rev": "1801b0541f4fda118a10798fd3486bb7051c5dd6"
+ }
+ },
+ "dependencies/openzeppelin-contracts": {
+ "tag": {
+ "name": "v5.5.0",
+ "rev": "fcbae5394ae8ad52d8e580a3477db99814b9d565"
+ }
+ },
+ "dependencies/permit2": {
+ "rev": "cc56ad0f3439c502c246fc5cfcc3db92bb8b7219"
+ },
+ "dependencies/signals-implicit-mode": {
+ "rev": "8d797cd5a963f8374cf780510b79d8350339c04d"
+ },
+ "dependencies/solady": {
+ "tag": {
+ "name": "v0.1.26",
+ "rev": "acd959aa4bd04720d640bf4e6a5c71037510cc4b"
+ }
+ },
+ "dependencies/universal-router": {
+ "rev": "41183d6eb154f0ab0e74a0e911a5ef9ea51fc4bd"
+ },
+ "dependencies/v2-core": {
+ "tag": {
+ "name": "v1.0.1",
+ "rev": "4dd59067c76dea4a0e8e4bfdda41877a6b16dedc"
+ }
+ },
+ "dependencies/v3-core": {
+ "tag": {
+ "name": "v1.0.0",
+ "rev": "e3589b192d0be27e100cd0daaf6c97204fdb1899"
+ }
+ },
+ "dependencies/v4-core": {
+ "tag": {
+ "name": "v4.0.0",
+ "rev": "e50237c43811bd9b526eff40f26772152a42daba"
+ }
+ },
+ "dependencies/v4-periphery": {
+ "rev": "60cd93803ac2b7fa65fd6cd351fd5fd4cc8c9db5"
+ },
+ "lib/solady": {
+ "tag": {
+ "name": "v0.1.26",
+ "rev": "acd959aa4bd04720d640bf4e6a5c71037510cc4b"
+ }
+ }
+}
\ No newline at end of file
diff --git a/foundry.toml b/foundry.toml
new file mode 100644
index 000000000..f776f544d
--- /dev/null
+++ b/foundry.toml
@@ -0,0 +1,10 @@
+[profile.default]
+src = "src"
+out = "out"
+libs = ["dependencies"]
+
+[dependencies]
+forge-std = "1.14.0"
+"@openzeppelin-contracts" = "5.0.2"
+
+# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
diff --git a/lib/signals-implicit-mode/.env.sample b/lib/signals-implicit-mode/.env.sample
new file mode 100644
index 000000000..6fc16b3cb
--- /dev/null
+++ b/lib/signals-implicit-mode/.env.sample
@@ -0,0 +1 @@
+PRIVATE_KEY=
diff --git a/lib/signals-implicit-mode/.gas-snapshot b/lib/signals-implicit-mode/.gas-snapshot
new file mode 100644
index 000000000..cd1257bd3
--- /dev/null
+++ b/lib/signals-implicit-mode/.gas-snapshot
@@ -0,0 +1,35 @@
+ImplicitProjectRegistryTest:test_addProjectUrl(address,bytes12,string) (runs: 256, μ: 116671, ~: 116810)
+ImplicitProjectRegistryTest:test_addProjectUrlBatch(address,bytes12,string[]) (runs: 256, μ: 720585, ~: 728375)
+ImplicitProjectRegistryTest:test_addProjectUrlHash(address,bytes12,bytes32) (runs: 256, μ: 112426, ~: 112426)
+ImplicitProjectRegistryTest:test_addProjectUrlHashBatch(address,bytes12,bytes32[]) (runs: 256, μ: 597763, ~: 608234)
+ImplicitProjectRegistryTest:test_claimProject(address,bytes12) (runs: 256, μ: 39958, ~: 39958)
+ImplicitProjectRegistryTest:test_fail_addProjectUrlAlreadyExists(address,bytes12,string) (runs: 256, μ: 112644, ~: 112783)
+ImplicitProjectRegistryTest:test_fail_addProjectUrlAlreadyExistsHash(address,bytes12,string) (runs: 256, μ: 111144, ~: 111259)
+ImplicitProjectRegistryTest:test_fail_addProjectUrlByNonOwner(address,address,bytes12,string) (runs: 256, μ: 41212, ~: 41173)
+ImplicitProjectRegistryTest:test_fail_addProjectUrlHashAlreadyExists(address,bytes12,bytes32) (runs: 256, μ: 108525, ~: 108525)
+ImplicitProjectRegistryTest:test_fail_addProjectUrlHashAlreadyExistsFull(address,bytes12,string) (runs: 256, μ: 111099, ~: 111214)
+ImplicitProjectRegistryTest:test_fail_addProjectUrlHashBatchByNonOwner(address,address,bytes12,bytes32[]) (runs: 256, μ: 87811, ~: 89313)
+ImplicitProjectRegistryTest:test_fail_addProjectUrlHashByNonOwner(address,address,bytes12,bytes32) (runs: 256, μ: 39718, ~: 39718)
+ImplicitProjectRegistryTest:test_fail_claimInvalidOwner(bytes12) (runs: 256, μ: 9949, ~: 9949)
+ImplicitProjectRegistryTest:test_fail_claimProjectTwice(address,address,bytes12) (runs: 256, μ: 45067, ~: 45067)
+ImplicitProjectRegistryTest:test_fail_removeNonexistentUrl(address,bytes12,string) (runs: 256, μ: 43756, ~: 43828)
+ImplicitProjectRegistryTest:test_fail_removeNonexistentUrlHash(address,bytes12,bytes32) (runs: 256, μ: 41619, ~: 41619)
+ImplicitProjectRegistryTest:test_fail_removeProjectUrlByNonOwner(address,address,bytes12,string) (runs: 256, μ: 41234, ~: 41195)
+ImplicitProjectRegistryTest:test_fail_removeProjectUrlHashBatchByNonOwner(address,address,bytes12,bytes32[]) (runs: 256, μ: 593982, ~: 603423)
+ImplicitProjectRegistryTest:test_fail_removeProjectUrlHashByNonOwner(address,address,bytes12,bytes32) (runs: 256, μ: 40142, ~: 40142)
+ImplicitProjectRegistryTest:test_fail_removeUrlHashWrongIndex(address,bytes12,bytes32[],uint256) (runs: 256, μ: 588246, ~: 596140)
+ImplicitProjectRegistryTest:test_fail_transferByNonAdmin(address,address,bytes12) (runs: 256, μ: 40195, ~: 40195)
+ImplicitProjectRegistryTest:test_fail_transferInvalidOwner(address,bytes12) (runs: 256, μ: 39035, ~: 39035)
+ImplicitProjectRegistryTest:test_fail_validateAttestationWithInvalidUrl(address,address,bytes12,string,string) (runs: 256, μ: 118943, ~: 118930)
+ImplicitProjectRegistryTest:test_removeProjectUrl(address,bytes12,string[],uint256) (runs: 256, μ: 677869, ~: 688567)
+ImplicitProjectRegistryTest:test_removeProjectUrlHash(address,bytes12,bytes32[],uint256) (runs: 256, μ: 563429, ~: 571346)
+ImplicitProjectRegistryTest:test_removeProjectUrlHashBatch(address,bytes12,bytes32[]) (runs: 256, μ: 514463, ~: 522326)
+ImplicitProjectRegistryTest:test_removeProjectUrlHashBatchWithInvalidUrlIdxs(address,bytes12,bytes32[],uint256[]) (runs: 256, μ: 231800, ~: 233726)
+ImplicitProjectRegistryTest:test_removeProjectUrlHashBatchWithInvalidUrlIdxsOrder(address,bytes12,bytes32[],uint256[]) (runs: 256, μ: 238667, ~: 251592)
+ImplicitProjectRegistryTest:test_transferProject(address,address,bytes12,bytes32) (runs: 256, μ: 119694, ~: 119694)
+ImplicitProjectRegistryTest:test_validateAttestationMultiple(address,address,bytes12,string[],uint256) (runs: 256, μ: 706695, ~: 712410)
+ImplicitProjectRegistryTest:test_validateAttestationSingle(address,address,bytes12,string) (runs: 256, μ: 120772, ~: 120602)
+SignalsImplicitModeTest:test_acceptsValidUrl(bytes12,address,string,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),address,(address,uint256,bytes,uint256,bool,bool,uint256)) (runs: 256, μ: 665701, ~: 665732)
+SignalsImplicitModeTest:test_acceptsValidUrlFromMultiple(bytes12,address,string[],uint256,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),address,(address,uint256,bytes,uint256,bool,bool,uint256)) (runs: 256, μ: 1254530, ~: 1269578)
+SignalsImplicitModeTest:test_rejectsInvalidUrl(bytes32,string,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),address,(address,uint256,bytes,uint256,bool,bool,uint256)) (runs: 256, μ: 562463, ~: 562443)
+SignalsImplicitModeTest:test_supportsInterface(bytes32) (runs: 256, μ: 540796, ~: 540796)
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/.github/workflows/test.yml b/lib/signals-implicit-mode/.github/workflows/test.yml
new file mode 100644
index 000000000..1be6707d7
--- /dev/null
+++ b/lib/signals-implicit-mode/.github/workflows/test.yml
@@ -0,0 +1,56 @@
+name: CI
+
+on:
+ push:
+ pull_request:
+ workflow_dispatch:
+
+env:
+ FOUNDRY_PROFILE: ci
+
+jobs:
+ check:
+ strategy:
+ fail-fast: true
+
+ name: Foundry project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+
+ - name: Use PAT
+ run: |
+ git config --global url."https://${{ secrets.SEQUENCE_V3_PAT }}@github.com/".insteadOf "https://github.com/"
+
+ - name: Download submodules
+ run: |
+ git submodule update --init --recursive
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+
+ - name: Show Forge version
+ run: |
+ forge --version
+
+ - name: Run Forge fmt
+ run: |
+ forge fmt --check
+ id: fmt
+
+ - name: Run Forge build
+ run: |
+ forge build --sizes
+ id: build
+
+ - name: Run Forge tests
+ run: |
+ forge test -vvv
+ id: test
+
+ - name: Run Coverage report
+ run: |
+ forge coverage --nmco "(script|test)"
+ id: coverage
diff --git a/lib/signals-implicit-mode/.gitmodules b/lib/signals-implicit-mode/.gitmodules
new file mode 100644
index 000000000..95a9dda98
--- /dev/null
+++ b/lib/signals-implicit-mode/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "lib/forge-std"]
+ path = lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "lib/sequence-v3"]
+ path = lib/sequence-v3
+ url = https://github.com/0xsequence/sequence-v3
+[submodule "lib/erc2470-libs"]
+ path = lib/erc2470-libs
+ url = https://github.com/ScreamingHawk/erc2470-libs
diff --git a/lib/signals-implicit-mode/README.md b/lib/signals-implicit-mode/README.md
new file mode 100644
index 000000000..c89779b41
--- /dev/null
+++ b/lib/signals-implicit-mode/README.md
@@ -0,0 +1,84 @@
+# Signals Implicit Mode
+
+Libraries for managing support for [Sequence Ecosystem Wallet](https://github.com/0xsequence/sequence-v3)'s [implicit sessions](https://github.com/0xsequence/sequence-v3/blob/master/docs/SESSIONS.md).
+
+## Implicit Registry
+
+The `ImplicitProjectRegistry` is an ownerless, singleton contract that allows a single contract to define the accepted `redirectUrl`s for their project. Using the registry gives a single point for management of accepted `redirectUrl`s.
+
+Using the registry is also a quick way to authorize implicit access to contracts from other projects.
+
+See below _Support Implicit Sessions_ for information on how to integrate with the registry.
+
+### Register Your Project URLs
+
+Select your `Project ID`. The project ID is composed of two parts:
+
+- A 12-byte (24 hex characters) upper portion that you choose
+- Your address as the lower 20 bytes
+
+To claim your project ID, call the `claimProject(bytes12 projectIdUpper)` function. The contract will automatically combine your chosen upper portion with your address to create the full project ID.
+
+> [!TIP]
+> Consider claiming your project ID on every chain you wish to support. Claiming a project ID does not imply you must use it.
+
+As the project owner, you can:
+
+- Add supported redirect URLs by calling `addProjectUrl(bytes32 projectId, string memory projectUrl)`
+- Remove URLs using `removeProjectUrl(bytes32 projectId, string memory projectUrl)`
+- Transfer project ownership using `transferProject(bytes32 projectId, address newOwner)`
+
+Anyone can list all project URLs using `listProjectUrls(bytes32 projectId)`.
+
+Integrate your contracts with the registry using your project ID as described in the next section.
+
+## Support Implicit Sessions
+
+Import this library into your project using forge.
+
+```sh
+cd
+forge install https://github.com/0xsequence/signals-implicit-mode
+```
+
+Extend the provided abstract contract implementation.
+
+```solidity
+// SPDX-License-Identifier: Apache-2.0
+pragma solidity ^0.8.13;
+
+import {SignalsImplicitMode} from "signals-implicit-mode/helper/SignalsImplicitMode.sol";
+
+contract ImplicitSupportedContract is SignalsImplicitMode {
+ constructor(address registry, bytes32 projectId) {
+ _initializeSignalsImplicitMode(registry, projectId);
+ }
+}
+```
+
+Optionally, extend the validation by implementing the `_validateImplicitRequest` hook.
+
+## Run Tests
+
+```sh
+forge test
+```
+
+## Deploy Contracts
+
+> [!NOTE]
+> This will deploy the `ImplicitProjectRegistry`. Deployments use ERC-2470 for counter factual deployments and will deploy to `0x1dbaE3Df2A510768a36cE998396210Be12508d50`.
+
+> [!TIP]
+> The `ImplicitProjectRegistry` is ownerless and so you are free to use an implementation and claim any `projectId`. You do not need to deploy your own instance.
+
+Copy the `env.sample` file to `.env` and set the environment variables.
+
+```sh
+cp .env.sample .env
+# Edit .env
+```
+
+```sh
+forge script Deploy --rpc-url --broadcast
+```
diff --git a/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-1770363485985.json b/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-1770363485985.json
new file mode 100644
index 000000000..523c6482c
--- /dev/null
+++ b/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-1770363485985.json
@@ -0,0 +1,58 @@
+{
+ "transactions": [
+ {
+ "hash": "0x32535d715233a9f552f46cd8e62bfe624ca606e0f9dd6711a3617f08c7737f3e",
+ "transactionType": "CALL",
+ "contractName": null,
+ "contractAddress": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "function": "deploy(bytes,bytes32)",
+ "arguments": [
+ "0x6080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea264697066735822122019bab80291bd8d50097cd6215757f008e2916b0f9a4cf413de02f4326173ea4664736f6c634300081c0033",
+ "0x0000000000000000000000000000000000000000000000000000000000000000"
+ ],
+ "transaction": {
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "gas": "0x2a588c",
+ "value": "0x0",
+ "input": "0x4af63f020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023936080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea264697066735822122019bab80291bd8d50097cd6215757f008e2916b0f9a4cf413de02f4326173ea4664736f6c634300081c003300000000000000000000000000",
+ "nonce": "0x12a6",
+ "chainId": "0x1"
+ },
+ "additionalContracts": [
+ {
+ "transactionType": "CREATE2",
+ "contractName": "ImplicitProjectRegistry",
+ "address": "0x899bcf2333159a0b54e562707426c8af262e0243",
+ "initCode": "0x6080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea264697066735822122019bab80291bd8d50097cd6215757f008e2916b0f9a4cf413de02f4326173ea4664736f6c634300081c0033"
+ }
+ ],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "status": "0x1",
+ "cumulativeGasUsed": "0x1eaa97",
+ "logs": [],
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "transactionHash": "0x32535d715233a9f552f46cd8e62bfe624ca606e0f9dd6711a3617f08c7737f3e",
+ "transactionIndex": "0x0",
+ "blockHash": "0xeb7968668d122ef113e50e9cf21472c5f5ad039a84682b38a389a979bc46a139",
+ "blockNumber": "0x17441d7",
+ "gasUsed": "0x1eaa97",
+ "effectiveGasPrice": "0xf4c91d4",
+ "blobGasPrice": "0x9",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "contractAddress": null
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1770363485985,
+ "chain": 1,
+ "commit": "96c1f12"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-1770364554426.json b/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-1770364554426.json
new file mode 100644
index 000000000..46c7dbb4e
--- /dev/null
+++ b/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-1770364554426.json
@@ -0,0 +1,58 @@
+{
+ "transactions": [
+ {
+ "hash": "0x335ccba1cae296bd60532d54cbb8a031788a66869952f27d91e5b7039540df06",
+ "transactionType": "CALL",
+ "contractName": null,
+ "contractAddress": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "function": "deploy(bytes,bytes32)",
+ "arguments": [
+ "0x6080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea26469706673582212204704a54d531aafb8da32f577e1884f79b39d1cde28ba592d2a3bea76266c660464736f6c634300081c0033",
+ "0x0000000000000000000000000000000000000000000000000000000000000000"
+ ],
+ "transaction": {
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "gas": "0x2a588c",
+ "value": "0x0",
+ "input": "0x4af63f020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023936080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea26469706673582212204704a54d531aafb8da32f577e1884f79b39d1cde28ba592d2a3bea76266c660464736f6c634300081c003300000000000000000000000000",
+ "nonce": "0x12a8",
+ "chainId": "0x1"
+ },
+ "additionalContracts": [
+ {
+ "transactionType": "CREATE2",
+ "contractName": "ImplicitProjectRegistry",
+ "address": "0x82d1c54520516de908300ff335f74ba9f4b58383",
+ "initCode": "0x6080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea26469706673582212204704a54d531aafb8da32f577e1884f79b39d1cde28ba592d2a3bea76266c660464736f6c634300081c0033"
+ }
+ ],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "status": "0x1",
+ "cumulativeGasUsed": "0x1eaa97",
+ "logs": [],
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "transactionHash": "0x335ccba1cae296bd60532d54cbb8a031788a66869952f27d91e5b7039540df06",
+ "transactionIndex": "0x0",
+ "blockHash": "0x67cb99d05049219d2e30c424a15256e5f72022267f5751e9fc93013cffefd9fb",
+ "blockNumber": "0x17441d9",
+ "gasUsed": "0x1eaa97",
+ "effectiveGasPrice": "0xbd738bd",
+ "blobGasPrice": "0x1",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "contractAddress": null
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1770364554426,
+ "chain": 1,
+ "commit": "96c1f12"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-latest.json b/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-latest.json
new file mode 100644
index 000000000..46c7dbb4e
--- /dev/null
+++ b/lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-latest.json
@@ -0,0 +1,58 @@
+{
+ "transactions": [
+ {
+ "hash": "0x335ccba1cae296bd60532d54cbb8a031788a66869952f27d91e5b7039540df06",
+ "transactionType": "CALL",
+ "contractName": null,
+ "contractAddress": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "function": "deploy(bytes,bytes32)",
+ "arguments": [
+ "0x6080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea26469706673582212204704a54d531aafb8da32f577e1884f79b39d1cde28ba592d2a3bea76266c660464736f6c634300081c0033",
+ "0x0000000000000000000000000000000000000000000000000000000000000000"
+ ],
+ "transaction": {
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "gas": "0x2a588c",
+ "value": "0x0",
+ "input": "0x4af63f020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023936080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea26469706673582212204704a54d531aafb8da32f577e1884f79b39d1cde28ba592d2a3bea76266c660464736f6c634300081c003300000000000000000000000000",
+ "nonce": "0x12a8",
+ "chainId": "0x1"
+ },
+ "additionalContracts": [
+ {
+ "transactionType": "CREATE2",
+ "contractName": "ImplicitProjectRegistry",
+ "address": "0x82d1c54520516de908300ff335f74ba9f4b58383",
+ "initCode": "0x6080604052348015600f57600080fd5b506123748061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063a25acb251161008c578063d9acbe6b11610066578063d9acbe6b14610243578063dac6c58714610273578063ebc27b821461028f578063f4364de6146102bf576100ea565b8063a25acb25146101c7578063d4c9c5c4146101f7578063d4df101814610213576100ea565b80633808a90b116100c85780633808a90b14610143578063520994f11461017357806356cd2b921461018f5780639630aff8146101ab576100ea565b8063065d6c69146100ef5780631b31f01b1461010b5780632f28c69d14610127575b600080fd5b61010960048036038101906101049190611436565b6102ef565b005b610125600480360381019061012091906114c8565b6103ca565b005b610141600480360381019061013c91906115d0565b610473565b005b61015d600480360381019061015891906116ae565b610522565b60405161016a919061172c565b60405180910390f35b61018d60048036038101906101889190611747565b610625565b005b6101a960048036038101906101a49190611868565b6106cc565b005b6101c560048036038101906101c091906118c4565b6107af565b005b6101e160048036038101906101dc9190611747565b610947565b6040516101ee919061191f565b60405180910390f35b610211600480360381019061020c91906119fd565b610976565b005b61022d60048036038101906102289190611ae0565b610b48565b60405161023a919061172c565b60405180910390f35b61025d60048036038101906102589190611b0d565b610d14565b60405161026a919061172c565b60405180910390f35b61028d600480360381019061028891906115d0565b610d45565b005b6102a960048036038101906102a49190611b4d565b610e98565b6040516102b69190611b89565b60405180910390f35b6102d960048036038101906102d49190611b4d565b610ecb565b6040516102e69190611c62565b60405180910390f35b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610387576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156103c4576103b7848483815181106103aa576103a9611c84565b5b6020026020010151610f36565b808060010191505061038a565b50505050565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610462576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61046d848484611047565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461050b576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61051d8361051884611200565b610f36565b505050565b60008061058f848060a001906105389190611cc2565b80600001906105479190611cea565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611200565b905060016000848152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16156105ec576105e485856105d690611fd4565b61123090919063ffffffff16565b91505061061e565b6040517fd7abef4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c78383610f36565b505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610764576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156107a95761079c8461079785848151811061078a57610789611c84565b5b6020026020010151611200565b610f36565b8080600101915050610767565b50505050565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610847576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108ad576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f7869f0fa3d7efaa83c69bf6de987567787178b8d7e41fea0cadfea68a2e27de560405160405180910390a3505050565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a0e576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151835114610a49576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b60018351610a5a9190612016565b811015610ae85782600182610a6f919061204a565b81518110610a8057610a7f611c84565b5b6020026020010151838281518110610a9b57610a9a611c84565b5b60200260200101511015610adb576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610a4c565b5060005b8351811015610b4157610b3485858381518110610b0c57610b0b611c84565b5b6020026020010151858481518110610b2757610b26611c84565b5b6020026020010151611047565b8080600101915050610aec565b5050505050565b600080339050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517fff7d580d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281604051602001610bc79291906120e7565b604051602081830303815290604052610bdf90612150565b9150600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c79576040517ffeabeb4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16827f0f01cd0734cc8ed416ac6ca25cb4fe02dbab63f1236af3858deb14a56663623860405160405180910390a350919050565b60026020528160005260406000208181548110610d3057600080fd5b90600052602060002001600091509150505481565b813373ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddd576040517f7c2411e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610de883611200565b905060005b6002600086815260200190815260200160002080549050811015610e605781600260008781526020019081526020016000208281548110610e3157610e30611c84565b5b906000526020600020015403610e5357610e4c858383611047565b5050610e93565b8080600101915050610ded565b506040517f4745a4ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f2a57602002820191906000526020600020905b815481526020019060010190808311610f16575b50505050509050919050565b60016000838152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1615610f9f576040517f2d86c03a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001806000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002081908060018154018082558091505060019003906000526020600020016000909190919091505580827fceac3080d7874c4bba80ceae14b6aa96e0df9d4f673d9e5a352d66444f50206760405160405180910390a35050565b60026000848152602001908152602001600020805490508110158061109b57508160026000858152602001908152602001600020828154811061108d5761108c611c84565b5b906000526020600020015414155b156110d2576040517f526c768700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060016000858152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff02191690831515021790555060026000848152602001908152602001600020600160026000868152602001908152602001600020805490506111459190612016565b8154811061115657611155611c84565b5b906000526020600020015460026000858152602001908152602001600020828154811061118657611185611c84565b5b9060005260206000200181905550600260008481526020019081526020016000208054806111b7576111b66121b7565b5b6001900381819060005260206000200160009055905581837f13d94de535e503661de3c84adf637590f269f37c8d4ed5daabae98376a442a6a60405160405180910390a3505050565b6000816040516020016112139190612257565b604051602081830303815290604052805190602001209050919050565b6000604051602001611241906122ba565b60405160208183030381529060405280519060200120828460600151856040015160405160200161127594939291906122f0565b60405160208183030381529060405280519060200120905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6112ba816112a7565b81146112c557600080fd5b50565b6000813590506112d7816112b1565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61132b826112e2565b810181811067ffffffffffffffff8211171561134a576113496112f3565b5b80604052505050565b600061135d611293565b90506113698282611322565b919050565b600067ffffffffffffffff821115611389576113886112f3565b5b602082029050602081019050919050565b600080fd5b60006113b26113ad8461136e565b611353565b905080838252602082019050602084028301858111156113d5576113d461139a565b5b835b818110156113fe57806113ea88826112c8565b8452602084019350506020810190506113d7565b5050509392505050565b600082601f83011261141d5761141c6112dd565b5b813561142d84826020860161139f565b91505092915050565b6000806040838503121561144d5761144c61129d565b5b600061145b858286016112c8565b925050602083013567ffffffffffffffff81111561147c5761147b6112a2565b5b61148885828601611408565b9150509250929050565b6000819050919050565b6114a581611492565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b6000806000606084860312156114e1576114e061129d565b5b60006114ef868287016112c8565b9350506020611500868287016112c8565b9250506040611511868287016114b3565b9150509250925092565b600080fd5b600067ffffffffffffffff82111561153b5761153a6112f3565b5b611544826112e2565b9050602081019050919050565b82818337600083830152505050565b600061157361156e84611520565b611353565b90508281526020810184848401111561158f5761158e61151b565b5b61159a848285611551565b509392505050565b600082601f8301126115b7576115b66112dd565b5b81356115c7848260208601611560565b91505092915050565b600080604083850312156115e7576115e661129d565b5b60006115f5858286016112c8565b925050602083013567ffffffffffffffff811115611616576116156112a2565b5b611622858286016115a2565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116578261162c565b9050919050565b6116678161164c565b811461167257600080fd5b50565b6000813590506116848161165e565b92915050565b600080fd5b600060c082840312156116a5576116a461168a565b5b81905092915050565b6000806000606084860312156116c7576116c661129d565b5b60006116d586828701611675565b935050602084013567ffffffffffffffff8111156116f6576116f56112a2565b5b6117028682870161168f565b9250506040611713868287016112c8565b9150509250925092565b611726816112a7565b82525050565b6000602082019050611741600083018461171d565b92915050565b6000806040838503121561175e5761175d61129d565b5b600061176c858286016112c8565b925050602061177d858286016112c8565b9150509250929050565b600067ffffffffffffffff8211156117a2576117a16112f3565b5b602082029050602081019050919050565b60006117c66117c184611787565b611353565b905080838252602082019050602084028301858111156117e9576117e861139a565b5b835b8181101561183057803567ffffffffffffffff81111561180e5761180d6112dd565b5b80860161181b89826115a2565b855260208501945050506020810190506117eb565b5050509392505050565b600082601f83011261184f5761184e6112dd565b5b813561185f8482602086016117b3565b91505092915050565b6000806040838503121561187f5761187e61129d565b5b600061188d858286016112c8565b925050602083013567ffffffffffffffff8111156118ae576118ad6112a2565b5b6118ba8582860161183a565b9150509250929050565b600080604083850312156118db576118da61129d565b5b60006118e9858286016112c8565b92505060206118fa85828601611675565b9150509250929050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600067ffffffffffffffff821115611955576119546112f3565b5b602082029050602081019050919050565b60006119796119748461193a565b611353565b9050808382526020820190506020840283018581111561199c5761199b61139a565b5b835b818110156119c557806119b188826114b3565b84526020840193505060208101905061199e565b5050509392505050565b600082601f8301126119e4576119e36112dd565b5b81356119f4848260208601611966565b91505092915050565b600080600060608486031215611a1657611a1561129d565b5b6000611a24868287016112c8565b935050602084013567ffffffffffffffff811115611a4557611a446112a2565b5b611a5186828701611408565b925050604084013567ffffffffffffffff811115611a7257611a716112a2565b5b611a7e868287016119cf565b9150509250925092565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b611abd81611a88565b8114611ac857600080fd5b50565b600081359050611ada81611ab4565b92915050565b600060208284031215611af657611af561129d565b5b6000611b0484828501611acb565b91505092915050565b60008060408385031215611b2457611b2361129d565b5b6000611b32858286016112c8565b9250506020611b43858286016114b3565b9150509250929050565b600060208284031215611b6357611b6261129d565b5b6000611b71848285016112c8565b91505092915050565b611b838161164c565b82525050565b6000602082019050611b9e6000830184611b7a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bd9816112a7565b82525050565b6000611beb8383611bd0565b60208301905092915050565b6000602082019050919050565b6000611c0f82611ba4565b611c198185611baf565b9350611c2483611bc0565b8060005b83811015611c55578151611c3c8882611bdf565b9750611c4783611bf7565b925050600181019050611c28565b5085935050505092915050565b60006020820190508181036000830152611c7c8184611c04565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001604003833603038112611cde57611cdd611cb3565b5b80830191505092915050565b60008083356001602003843603038112611d0757611d06611cb3565b5b80840192508235915067ffffffffffffffff821115611d2957611d28611cb8565b5b602083019250600182023603831315611d4557611d44611cbd565b5b509250929050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8c81611d57565b8114611d9757600080fd5b50565b600081359050611da981611d83565b92915050565b600067ffffffffffffffff821115611dca57611dc96112f3565b5b611dd3826112e2565b9050602081019050919050565b6000611df3611dee84611daf565b611353565b905082815260208101848484011115611e0f57611e0e61151b565b5b611e1a848285611551565b509392505050565b600082601f830112611e3757611e366112dd565b5b8135611e47848260208601611de0565b91505092915050565b600067ffffffffffffffff82169050919050565b611e6d81611e50565b8114611e7857600080fd5b50565b600081359050611e8a81611e64565b92915050565b600060408284031215611ea657611ea5611d4d565b5b611eb06040611353565b9050600082013567ffffffffffffffff811115611ed057611ecf611d52565b5b611edc848285016115a2565b6000830152506020611ef084828501611e7b565b60208301525092915050565b600060c08284031215611f1257611f11611d4d565b5b611f1c60c0611353565b90506000611f2c84828501611675565b6000830152506020611f4084828501611d9a565b6020830152506040611f54848285016112c8565b6040830152506060611f68848285016112c8565b606083015250608082013567ffffffffffffffff811115611f8c57611f8b611d52565b5b611f9884828501611e22565b60808301525060a082013567ffffffffffffffff811115611fbc57611fbb611d52565b5b611fc884828501611e90565b60a08301525092915050565b6000611fe03683611efc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061202182611492565b915061202c83611492565b925082820390508181111561204457612043611fe7565b5b92915050565b600061205582611492565b915061206083611492565b925082820190508082111561207857612077611fe7565b5b92915050565b6000819050919050565b61209961209482611a88565b61207e565b82525050565b60008160601b9050919050565b60006120b78261209f565b9050919050565b60006120c9826120ac565b9050919050565b6120e16120dc8261164c565b6120be565b82525050565b60006120f38285612088565b600c8201915061210382846120d0565b6014820191508190509392505050565b600081519050919050565b6000819050602082019050919050565b600061213a82516112a7565b80915050919050565b600082821b905092915050565b600061215b82612113565b826121658461211e565b90506121708161212e565b925060208210156121b0576121ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612143565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600081905092915050565b60005b8381101561221a5780820151818401526020810190506121ff565b60008484015250505050565b6000612231826121e6565b61223b81856121f1565b935061224b8185602086016121fc565b80840191505092915050565b60006122638284612226565b915081905092915050565b7f616363657074496d706c69636974526571756573740000000000000000000000600082015250565b60006122a46015836121f1565b91506122af8261226e565b601582019050919050565b60006122c582612297565b9150819050919050565b6000819050919050565b6122ea6122e5826112a7565b6122cf565b82525050565b60006122fc82876122d9565b60208201915061230c82866120d0565b60148201915061231c82856122d9565b60208201915061232c82846122d9565b6020820191508190509594505050505056fea26469706673582212204704a54d531aafb8da32f577e1884f79b39d1cde28ba592d2a3bea76266c660464736f6c634300081c0033"
+ }
+ ],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "status": "0x1",
+ "cumulativeGasUsed": "0x1eaa97",
+ "logs": [],
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "transactionHash": "0x335ccba1cae296bd60532d54cbb8a031788a66869952f27d91e5b7039540df06",
+ "transactionIndex": "0x0",
+ "blockHash": "0x67cb99d05049219d2e30c424a15256e5f72022267f5751e9fc93013cffefd9fb",
+ "blockNumber": "0x17441d9",
+ "gasUsed": "0x1eaa97",
+ "effectiveGasPrice": "0xbd738bd",
+ "blobGasPrice": "0x1",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xce0042b868300000d44a59004da54a005ffdcf9f",
+ "contractAddress": null
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1770364554426,
+ "chain": 1,
+ "commit": "96c1f12"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-1770363485985.json b/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-1770363485985.json
new file mode 100644
index 000000000..3d489aedf
--- /dev/null
+++ b/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-1770363485985.json
@@ -0,0 +1,7 @@
+{
+ "transactions": [
+ {
+ "rpc": "http://127.0.0.1:8545"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-1770364554426.json b/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-1770364554426.json
new file mode 100644
index 000000000..3d489aedf
--- /dev/null
+++ b/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-1770364554426.json
@@ -0,0 +1,7 @@
+{
+ "transactions": [
+ {
+ "rpc": "http://127.0.0.1:8545"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-latest.json b/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-latest.json
new file mode 100644
index 000000000..3d489aedf
--- /dev/null
+++ b/lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-latest.json
@@ -0,0 +1,7 @@
+{
+ "transactions": [
+ {
+ "rpc": "http://127.0.0.1:8545"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/cache/solidity-files-cache.json b/lib/signals-implicit-mode/cache/solidity-files-cache.json
new file mode 100644
index 000000000..57ff140ea
--- /dev/null
+++ b/lib/signals-implicit-mode/cache/solidity-files-cache.json
@@ -0,0 +1 @@
+{"_format":"","paths":{"artifacts":"out","build_infos":"out/build-info","sources":"src","tests":"test","scripts":"script","libraries":["dependencies","lib"]},"files":{"lib/forge-std/src/Base.sol":{"lastModificationDate":1770101762022,"contentHash":"f4bd67fdeb49a95a","interfaceReprHash":null,"sourceName":"lib/forge-std/src/Base.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"CommonBase":{"0.8.28":{"default":{"path":"Base.sol/CommonBase.json","build_id":"6df801dae8a4cdc2"}}},"ScriptBase":{"0.8.28":{"default":{"path":"Base.sol/ScriptBase.json","build_id":"6df801dae8a4cdc2"}}},"TestBase":{"0.8.28":{"default":{"path":"Base.sol/TestBase.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/Script.sol":{"lastModificationDate":1770101762050,"contentHash":"654eb74437773a2d","interfaceReprHash":null,"sourceName":"lib/forge-std/src/Script.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdConstants.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/safeconsole.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Script":{"0.8.28":{"default":{"path":"Script.sol/Script.json","build_id":"efb7c762ba0fcac7"}}}},"seenByCompiler":true},"lib/forge-std/src/StdAssertions.sol":{"lastModificationDate":1770101762161,"contentHash":"02aafa55c6c27fcf","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdAssertions.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdAssertions":{"0.8.28":{"default":{"path":"StdAssertions.sol/StdAssertions.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdChains.sol":{"lastModificationDate":1770101762162,"contentHash":"0adbf4fecabd792e","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdChains.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdChains":{"0.8.28":{"default":{"path":"StdChains.sol/StdChains.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdCheats.sol":{"lastModificationDate":1770101762163,"contentHash":"30325e8cda32c7ae","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdCheats.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdCheats":{"0.8.28":{"default":{"path":"StdCheats.sol/StdCheats.json","build_id":"6df801dae8a4cdc2"}}},"StdCheatsSafe":{"0.8.28":{"default":{"path":"StdCheats.sol/StdCheatsSafe.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdConstants.sol":{"lastModificationDate":1770101762165,"contentHash":"23303eb7e922efe4","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdConstants.sol","imports":["lib/forge-std/src/Vm.sol","lib/forge-std/src/interfaces/IMulticall3.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdConstants":{"0.8.28":{"default":{"path":"StdConstants.sol/StdConstants.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdError.sol":{"lastModificationDate":1770101762166,"contentHash":"a1a86c7115e2cdf3","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdError.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdError":{"0.8.28":{"default":{"path":"StdError.sol/stdError.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdInvariant.sol":{"lastModificationDate":1770101762167,"contentHash":"0111ef959dff6f54","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdInvariant.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdInvariant":{"0.8.28":{"default":{"path":"StdInvariant.sol/StdInvariant.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdJson.sol":{"lastModificationDate":1770101762168,"contentHash":"5fb1b35c8fb281fd","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdJson.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdJson":{"0.8.28":{"default":{"path":"StdJson.sol/stdJson.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdMath.sol":{"lastModificationDate":1770101762169,"contentHash":"72584abebada1e7a","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdMath.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdMath":{"0.8.28":{"default":{"path":"StdMath.sol/stdMath.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStorage.sol":{"lastModificationDate":1770101762171,"contentHash":"9a44dcb9bda3bfa9","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdStorage.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdStorage":{"0.8.28":{"default":{"path":"StdStorage.sol/stdStorage.json","build_id":"6df801dae8a4cdc2"}}},"stdStorageSafe":{"0.8.28":{"default":{"path":"StdStorage.sol/stdStorageSafe.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStyle.sol":{"lastModificationDate":1770101762172,"contentHash":"ee166ef95092736e","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdStyle.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"StdStyle":{"0.8.28":{"default":{"path":"StdStyle.sol/StdStyle.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdToml.sol":{"lastModificationDate":1770101762172,"contentHash":"fc667e4ecb7fa86c","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdToml.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdToml":{"0.8.28":{"default":{"path":"StdToml.sol/stdToml.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/StdUtils.sol":{"lastModificationDate":1770101762173,"contentHash":"b7cdeb66252de708","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdUtils.sol","imports":["lib/forge-std/src/Vm.sol","lib/forge-std/src/interfaces/IMulticall3.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdUtils":{"0.8.28":{"default":{"path":"StdUtils.sol/StdUtils.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/Test.sol":{"lastModificationDate":1770101762174,"contentHash":"f56119a09f81c62c","interfaceReprHash":null,"sourceName":"lib/forge-std/src/Test.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdConstants.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/safeconsole.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Test":{"0.8.28":{"default":{"path":"Test.sol/Test.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/Vm.sol":{"lastModificationDate":1770101762176,"contentHash":"803443adcf84cfaa","interfaceReprHash":null,"sourceName":"lib/forge-std/src/Vm.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Vm":{"0.8.28":{"default":{"path":"Vm.sol/Vm.json","build_id":"6df801dae8a4cdc2"}}},"VmSafe":{"0.8.28":{"default":{"path":"Vm.sol/VmSafe.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/console.sol":{"lastModificationDate":1770101762177,"contentHash":"bae85493a76fb054","interfaceReprHash":null,"sourceName":"lib/forge-std/src/console.sol","imports":[],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"console":{"0.8.28":{"default":{"path":"console.sol/console.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/console2.sol":{"lastModificationDate":1770101762179,"contentHash":"49a7da3dfc404603","interfaceReprHash":null,"sourceName":"lib/forge-std/src/console2.sol","imports":["lib/forge-std/src/console.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{},"seenByCompiler":true},"lib/forge-std/src/interfaces/IMulticall3.sol":{"lastModificationDate":1770101762364,"contentHash":"b680a332ebf10901","interfaceReprHash":null,"sourceName":"lib/forge-std/src/interfaces/IMulticall3.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"IMulticall3":{"0.8.28":{"default":{"path":"IMulticall3.sol/IMulticall3.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/forge-std/src/safeconsole.sol":{"lastModificationDate":1770101762367,"contentHash":"621653b34a6691ea","interfaceReprHash":null,"sourceName":"lib/forge-std/src/safeconsole.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"safeconsole":{"0.8.28":{"default":{"path":"safeconsole.sol/safeconsole.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/sequence-v3/lib/erc2470-libs/script/SingletonDeployer.s.sol":{"lastModificationDate":1770101765184,"contentHash":"3e34bb2b04049795","interfaceReprHash":null,"sourceName":"lib/sequence-v3/lib/erc2470-libs/script/SingletonDeployer.s.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdConstants.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/safeconsole.sol","lib/sequence-v3/lib/erc2470-libs/src/ISingletonFactory.sol"],"versionRequirement":"^0.8.18","artifacts":{"SingletonDeployer":{"0.8.28":{"default":{"path":"SingletonDeployer.s.sol/SingletonDeployer.json","build_id":"efb7c762ba0fcac7"}}}},"seenByCompiler":true},"lib/sequence-v3/lib/erc2470-libs/src/ISingletonFactory.sol":{"lastModificationDate":1770101765185,"contentHash":"1bda2b8e14acc154","interfaceReprHash":null,"sourceName":"lib/sequence-v3/lib/erc2470-libs/src/ISingletonFactory.sol","imports":[],"versionRequirement":"^0.8.18","artifacts":{"ISingletonFactory":{"0.8.28":{"default":{"path":"ISingletonFactory.sol/ISingletonFactory.json","build_id":"efb7c762ba0fcac7"}}}},"seenByCompiler":true},"lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"lastModificationDate":1770101769236,"contentHash":"d909f0608672501c","interfaceReprHash":null,"sourceName":"lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol","imports":["lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol"],"versionRequirement":"^0.8.20","artifacts":{"ERC165":{"0.8.28":{"default":{"path":"ERC165.sol/ERC165.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"lastModificationDate":1770101769238,"contentHash":"a95786011a8cb3b2","interfaceReprHash":null,"sourceName":"lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"IERC165":{"0.8.28":{"default":{"path":"IERC165.sol/IERC165.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol":{"lastModificationDate":1770101769885,"contentHash":"725b2ff09f17c325","interfaceReprHash":null,"sourceName":"lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","imports":["lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol"],"versionRequirement":"^0.8.27","artifacts":{"LibAttestation":{"0.8.28":{"default":{"path":"Attestation.sol/LibAttestation.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol":{"lastModificationDate":1770101769886,"contentHash":"10ed3a2c21a500f2","interfaceReprHash":null,"sourceName":"lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","imports":["lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol"],"versionRequirement":"^0.8.27","artifacts":{"ISignalsImplicitMode":{"0.8.28":{"default":{"path":"ISignalsImplicitMode.sol/ISignalsImplicitMode.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/sequence-v3/src/modules/Payload.sol":{"lastModificationDate":1770101769892,"contentHash":"7a00dba6321ef947","interfaceReprHash":null,"sourceName":"lib/sequence-v3/src/modules/Payload.sol","imports":["lib/sequence-v3/src/utils/LibBytes.sol"],"versionRequirement":"^0.8.27","artifacts":{"Payload":{"0.8.28":{"default":{"path":"Payload.sol/Payload.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"lib/sequence-v3/src/utils/LibBytes.sol":{"lastModificationDate":1770101769908,"contentHash":"78548bb647cca49c","interfaceReprHash":null,"sourceName":"lib/sequence-v3/src/utils/LibBytes.sol","imports":[],"versionRequirement":"^0.8.18","artifacts":{"LibBytes":{"0.8.28":{"default":{"path":"LibBytes.sol/LibBytes.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"script/Deploy.s.sol":{"lastModificationDate":1770361770322,"contentHash":"d58cc965f18a84b5","interfaceReprHash":null,"sourceName":"script/Deploy.s.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdConstants.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/safeconsole.sol","lib/sequence-v3/lib/erc2470-libs/script/SingletonDeployer.s.sol","lib/sequence-v3/lib/erc2470-libs/src/ISingletonFactory.sol","lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol","src/registry/IImplicitProjectRegistry.sol","src/registry/IImplicitProjectValidation.sol","src/registry/ImplicitProjectRegistry.sol"],"versionRequirement":"^0.8.27","artifacts":{"Deploy":{"0.8.28":{"default":{"path":"Deploy.s.sol/Deploy.json","build_id":"efb7c762ba0fcac7"}}}},"seenByCompiler":true},"src/helper/SignalsImplicitMode.sol":{"lastModificationDate":1770361770368,"contentHash":"37ca4b7406fabdbb","interfaceReprHash":null,"sourceName":"src/helper/SignalsImplicitMode.sol","imports":["lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol","lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol","lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol","src/registry/IImplicitProjectValidation.sol"],"versionRequirement":"^0.8.13","artifacts":{"SignalsImplicitMode":{"0.8.28":{"default":{"path":"SignalsImplicitMode.sol/SignalsImplicitMode.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"src/registry/IImplicitProjectRegistry.sol":{"lastModificationDate":1770361770434,"contentHash":"2c79f59dd617050b","interfaceReprHash":null,"sourceName":"src/registry/IImplicitProjectRegistry.sol","imports":["lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol","src/registry/IImplicitProjectValidation.sol"],"versionRequirement":"^0.8.13","artifacts":{"IImplicitProjectRegistry":{"0.8.28":{"default":{"path":"IImplicitProjectRegistry.sol/IImplicitProjectRegistry.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"src/registry/IImplicitProjectValidation.sol":{"lastModificationDate":1770361770369,"contentHash":"0e5a2e7a8b6c7e32","interfaceReprHash":null,"sourceName":"src/registry/IImplicitProjectValidation.sol","imports":["lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol"],"versionRequirement":"^0.8.13","artifacts":{"IImplicitProjectValidation":{"0.8.28":{"default":{"path":"IImplicitProjectValidation.sol/IImplicitProjectValidation.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"src/registry/ImplicitProjectRegistry.sol":{"lastModificationDate":1770361770401,"contentHash":"ef64b470cee9db69","interfaceReprHash":null,"sourceName":"src/registry/ImplicitProjectRegistry.sol","imports":["lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol","src/registry/IImplicitProjectRegistry.sol","src/registry/IImplicitProjectValidation.sol"],"versionRequirement":"^0.8.13","artifacts":{"ImplicitProjectRegistry":{"0.8.28":{"default":{"path":"ImplicitProjectRegistry.sol/ImplicitProjectRegistry.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"test/ImplicitProjectRegistry.t.sol":{"lastModificationDate":1770361770510,"contentHash":"01215c2f20438804","interfaceReprHash":null,"sourceName":"test/ImplicitProjectRegistry.t.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdConstants.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/safeconsole.sol","lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol","lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol","lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol","src/helper/SignalsImplicitMode.sol","src/registry/IImplicitProjectRegistry.sol","src/registry/IImplicitProjectValidation.sol","src/registry/ImplicitProjectRegistry.sol","test/TestHelper.sol","test/mock/SignalsImplicitModeMock.sol"],"versionRequirement":"^0.8.13","artifacts":{"ImplicitProjectRegistryTest":{"0.8.28":{"default":{"path":"ImplicitProjectRegistry.t.sol/ImplicitProjectRegistryTest.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"test/SignalsImplicitMode.t.sol":{"lastModificationDate":1770361770325,"contentHash":"53f3acacdb557256","interfaceReprHash":null,"sourceName":"test/SignalsImplicitMode.t.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdConstants.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/safeconsole.sol","lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol","lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol","lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol","src/helper/SignalsImplicitMode.sol","src/registry/IImplicitProjectRegistry.sol","src/registry/IImplicitProjectValidation.sol","src/registry/ImplicitProjectRegistry.sol","test/TestHelper.sol","test/mock/SignalsImplicitModeMock.sol"],"versionRequirement":"^0.8.13","artifacts":{"SignalsImplicitModeTest":{"0.8.28":{"default":{"path":"SignalsImplicitMode.t.sol/SignalsImplicitModeTest.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"test/TestHelper.sol":{"lastModificationDate":1770361770382,"contentHash":"a23c385df903ee97","interfaceReprHash":null,"sourceName":"test/TestHelper.sol","imports":[],"versionRequirement":"^0.8.13","artifacts":{"TestHelper":{"0.8.28":{"default":{"path":"TestHelper.sol/TestHelper.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true},"test/mock/SignalsImplicitModeMock.sol":{"lastModificationDate":1770361771227,"contentHash":"b71bc913f2524674","interfaceReprHash":null,"sourceName":"test/mock/SignalsImplicitModeMock.sol","imports":["lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol","lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol","lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol","lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol","lib/sequence-v3/src/modules/Payload.sol","lib/sequence-v3/src/utils/LibBytes.sol","src/helper/SignalsImplicitMode.sol","src/registry/IImplicitProjectValidation.sol"],"versionRequirement":"^0.8.13","artifacts":{"SignalsImplicitModeMock":{"0.8.28":{"default":{"path":"SignalsImplicitModeMock.sol/SignalsImplicitModeMock.json","build_id":"6df801dae8a4cdc2"}}}},"seenByCompiler":true}},"builds":["6df801dae8a4cdc2","efb7c762ba0fcac7"],"profiles":{"default":{"solc":{"optimizer":{"enabled":false,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":false,"libraries":{}},"vyper":{"evmVersion":"paris","outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode"]}}}}},"preprocessed":false,"mocks":[]}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/CODEOWNERS b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/CODEOWNERS
new file mode 100644
index 000000000..beae7aa87
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/CODEOWNERS
@@ -0,0 +1 @@
+* @danipopes @klkvr @mattsse @grandizzy @yash-atreya @zerosnacks @onbjerg @0xrusowsky
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/dependabot.yml b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/dependabot.yml
new file mode 100644
index 000000000..5ace4600a
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/workflows/ci.yml b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/workflows/ci.yml
new file mode 100644
index 000000000..0d81c7551
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/workflows/ci.yml
@@ -0,0 +1,125 @@
+name: CI
+
+permissions: {}
+
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches:
+ - master
+
+jobs:
+ build:
+ name: build +${{ matrix.toolchain }} ${{ matrix.flags }}
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ permissions:
+ contents: read
+ strategy:
+ fail-fast: false
+ matrix:
+ toolchain: [stable, nightly]
+ flags:
+ - ""
+ - --via-ir
+ - --use solc:0.8.33 --via-ir
+ - --use solc:0.8.33
+ - --use solc:0.8.13 --via-ir
+ - --use solc:0.8.13
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ - uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: ${{ matrix.toolchain }}
+ - run: forge --version
+ - run: forge build -vvvvv --skip test --deny warnings ${{ matrix.flags }} --contracts 'test/compilation/*'
+
+ test:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ permissions:
+ contents: read
+ strategy:
+ fail-fast: false
+ matrix:
+ toolchain: [stable, nightly]
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ - uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: ${{ matrix.toolchain }}
+ - run: forge --version
+ - run: forge test -vvv
+
+ fmt:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ - uses: foundry-rs/foundry-toolchain@v1
+ - run: forge --version
+ - run: forge fmt --check
+
+ typos:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ - uses: crate-ci/typos@5c19779cb52ea50e151f5a10333ccd269227b5ae # v1
+
+ codeql:
+ name: Analyze (${{ matrix.language }})
+ runs-on: ubuntu-latest
+ permissions:
+ security-events: write
+ actions: read
+ contents: read
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - language: actions
+ build-mode: none
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v4
+ with:
+ languages: ${{ matrix.language }}
+ build-mode: ${{ matrix.build-mode }}
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v4
+ with:
+ category: "/language:${{matrix.language}}"
+
+ ci-success:
+ runs-on: ubuntu-latest
+ if: always()
+ needs:
+ - build
+ - test
+ - fmt
+ - typos
+ - codeql
+ timeout-minutes: 10
+ steps:
+ - name: Decide whether the needed jobs succeeded or failed
+ uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # release/v1
+ with:
+ jobs: ${{ toJSON(needs) }}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/workflows/sync.yml b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/workflows/sync.yml
new file mode 100644
index 000000000..ad4b173cd
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/workflows/sync.yml
@@ -0,0 +1,36 @@
+name: Sync Release Branch
+
+permissions: {}
+
+on:
+ release:
+ types:
+ - created
+
+jobs:
+ sync-release-branch:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ if: startsWith(github.event.release.tag_name, 'v1')
+ steps:
+ - name: Check out the repo
+ uses: actions/checkout@v6
+ with:
+ persist-credentials: true
+ fetch-depth: 0
+ ref: v1
+
+ # The email is derived from the bots user id,
+ # found here: https://api.github.com/users/github-actions%5Bbot%5D
+ - name: Configure Git
+ run: |
+ git config user.name github-actions[bot]
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+
+ - name: Sync Release Branch
+ run: |
+ git fetch --tags
+ git checkout v1
+ git reset --hard ${GITHUB_REF}
+ git push --force
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.gitignore b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.gitignore
new file mode 100644
index 000000000..756106d38
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.gitignore
@@ -0,0 +1,4 @@
+cache/
+out/
+.vscode
+.idea
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/CONTRIBUTING.md b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/CONTRIBUTING.md
new file mode 100644
index 000000000..9f643ecec
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/CONTRIBUTING.md
@@ -0,0 +1,193 @@
+## Contributing to Foundry
+
+Thanks for your interest in improving Foundry!
+
+There are multiple opportunities to contribute at any level. It doesn't matter if you are just getting started with Rust or are the most weathered expert, we can use your help.
+
+This document will help you get started. **Do not let the document intimidate you**.
+It should be considered as a guide to help you navigate the process.
+
+The [dev Telegram][dev-tg] is available for any concerns you may have that are not covered in this guide.
+
+### Code of Conduct
+
+The Foundry project adheres to the [Rust Code of Conduct][rust-coc]. This code of conduct describes the _minimum_ behavior expected from all contributors.
+
+Instances of violations of the Code of Conduct can be reported by contacting the team at [me@gakonst.com](mailto:me@gakonst.com).
+
+### Ways to contribute
+
+There are fundamentally four ways an individual can contribute:
+
+1. **By opening an issue:** For example, if you believe that you have uncovered a bug
+ in Foundry, creating a new issue in the issue tracker is the way to report it.
+2. **By adding context:** Providing additional context to existing issues,
+ such as screenshots and code snippets, which help resolve issues.
+3. **By resolving issues:** Typically this is done in the form of either
+ demonstrating that the issue reported is not a problem after all, or more often,
+ by opening a pull request that fixes the underlying problem, in a concrete and
+ reviewable manner.
+
+**Anybody can participate in any stage of contribution**. We urge you to participate in the discussion
+around bugs and participate in reviewing PRs.
+
+### Contributions Related to Spelling and Grammar
+
+At this time, we will not be accepting contributions that only fix spelling or grammatical errors in documentation, code or
+elsewhere.
+
+### Asking for help
+
+If you have reviewed existing documentation and still have questions, or you are having problems, you can get help in the following ways:
+
+- **Asking in the support Telegram:** The [Foundry Support Telegram][support-tg] is a fast and easy way to ask questions.
+- **Opening a discussion:** This repository comes with a discussions board where you can also ask for help. Click the "Discussions" tab at the top.
+
+As Foundry is still in heavy development, the documentation can be a bit scattered.
+The [Foundry Book][foundry-book] is our current best-effort attempt at keeping up-to-date information.
+
+### Submitting a bug report
+
+When filing a new bug report in the issue tracker, you will be presented with a basic form to fill out.
+
+If you believe that you have uncovered a bug, please fill out the form to the best of your ability. Do not worry if you cannot answer every detail; just fill in what you can. Contributors will ask follow-up questions if something is unclear.
+
+The most important pieces of information we need in a bug report are:
+
+- The Foundry version you are on (and that it is up to date)
+- The platform you are on (Windows, macOS, an M1 Mac or Linux)
+- Code snippets if this is happening in relation to testing or building code
+- Concrete steps to reproduce the bug
+
+In order to rule out the possibility of the bug being in your project, the code snippets should be as minimal
+as possible. It is better if you can reproduce the bug with a small snippet as opposed to an entire project!
+
+See [this guide][mcve] on how to create a minimal, complete, and verifiable example.
+
+### Submitting a feature request
+
+When adding a feature request in the issue tracker, you will be presented with a basic form to fill out.
+
+Please include as detailed of an explanation as possible of the feature you would like, adding additional context if necessary.
+
+If you have examples of other tools that have the feature you are requesting, please include them as well.
+
+### Resolving an issue
+
+Pull requests are the way concrete changes are made to the code, documentation, and dependencies of Foundry.
+
+Even minor pull requests, such as those fixing wording, are greatly appreciated. Before making a large change, it is usually
+a good idea to first open an issue describing the change to solicit feedback and guidance. This will increase
+the likelihood of the PR getting merged.
+
+Please make sure that the following commands pass if you have changed the code:
+
+```sh
+forge fmt --check
+forge test -vvv
+```
+
+To make sure your changes are compatible with all compiler version targets, run the following commands:
+
+```sh
+forge build --skip test --use solc:0.6.2
+forge build --skip test --use solc:0.6.12
+forge build --skip test --use solc:0.7.0
+forge build --skip test --use solc:0.7.6
+forge build --skip test --use solc:0.8.0
+```
+
+The CI will also ensure that the code is formatted correctly and that the tests are passing across all compiler version targets.
+
+#### Adding cheatcodes
+
+Please follow the guide outlined in the [cheatcodes](https://github.com/foundry-rs/foundry/blob/master/docs/dev/cheatcodes.md#adding-a-new-cheatcode) documentation of Foundry.
+
+When making modifications to the native cheatcodes or adding new ones, please make sure to run [`./scripts/vm.py`](./scripts/vm.py) to update the cheatcodes in the [`src/Vm.sol`](./src/Vm.sol) file.
+
+By default the script will automatically generate the cheatcodes from the [`cheatcodes.json`](https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json) file but alternatively you can provide a path to a JSON file containing the Vm interface, as generated by Foundry, with the `--from` flag.
+
+```sh
+./scripts/vm.py --from path/to/cheatcodes.json
+```
+
+It is possible that the resulting [`src/Vm.sol`](./src/Vm.sol) file will have some changes that are not directly related to your changes, this is not a problem.
+
+#### Commits
+
+It is a recommended best practice to keep your changes as logically grouped as possible within individual commits. There is no limit to the number of commits any single pull request may have, and many contributors find it easier to review changes that are split across multiple commits.
+
+That said, if you have a number of commits that are "checkpoints" and don't represent a single logical change, please squash those together.
+
+#### Opening the pull request
+
+From within GitHub, opening a new pull request will present you with a template that should be filled out. Please try your best at filling out the details, but feel free to skip parts if you're not sure what to put.
+
+#### Discuss and update
+
+You will probably get feedback or requests for changes to your pull request.
+This is a big part of the submission process, so don't be discouraged! Some contributors may sign off on the pull request right away, others may have more detailed comments or feedback.
+This is a necessary part of the process in order to evaluate whether the changes are correct and necessary.
+
+**Any community member can review a PR, so you might get conflicting feedback**.
+Keep an eye out for comments from code owners to provide guidance on conflicting feedback.
+
+#### Reviewing pull requests
+
+**Any Foundry community member is welcome to review any pull request**.
+
+All contributors who choose to review and provide feedback on pull requests have a responsibility to both the project and individual making the contribution. Reviews and feedback must be helpful, insightful, and geared towards improving the contribution as opposed to simply blocking it. If there are reasons why you feel the PR should not be merged, explain what those are. Do not expect to be able to block a PR from advancing simply because you say "no" without giving an explanation. Be open to having your mind changed. Be open to working _with_ the contributor to make the pull request better.
+
+Reviews that are dismissive or disrespectful of the contributor or any other reviewers are strictly counter to the Code of Conduct.
+
+When reviewing a pull request, the primary goals are for the codebase to improve and for the person submitting the request to succeed. **Even if a pull request is not merged, the submitter should come away from the experience feeling like their effort was not unappreciated**. Every PR from a new contributor is an opportunity to grow the community.
+
+##### Review a bit at a time
+
+Do not overwhelm new contributors.
+
+It is tempting to micro-optimize and make everything about relative performance, perfect grammar, or exact style matches. Do not succumb to that temptation.
+
+Focus first on the most significant aspects of the change:
+
+1. Does this change make sense for Foundry?
+2. Does this change make Foundry better, even if only incrementally?
+3. Are there clear bugs or larger scale issues that need attending?
+4. Are the commit messages readable and correct? If it contains a breaking change, is it clear enough?
+
+Note that only **incremental** improvement is needed to land a PR. This means that the PR does not need to be perfect, only better than the status quo. Follow-up PRs may be opened to continue iterating.
+
+When changes are necessary, _request_ them, do not _demand_ them, and **do not assume that the submitter already knows how to add a test or run a benchmark**.
+
+Specific performance optimization techniques, coding styles and conventions change over time. The first impression you give to a new contributor never does.
+
+Nits (requests for small changes that are not essential) are fine, but try to avoid stalling the pull request. Most nits can typically be fixed by the Foundry maintainers merging the pull request, but they can also be an opportunity for the contributor to learn a bit more about the project.
+
+It is always good to clearly indicate nits when you comment, e.g.: `Nit: change foo() to bar(). But this is not blocking`.
+
+If your comments were addressed but were not folded after new commits, or if they proved to be mistaken, please, [hide them][hiding-a-comment] with the appropriate reason to keep the conversation flow concise and relevant.
+
+##### Be aware of the person behind the code
+
+Be aware that _how_ you communicate requests and reviews in your feedback can have a significant impact on the success of the pull request. Yes, we may merge a particular change that makes Foundry better, but the individual might just not want to have anything to do with Foundry ever again. The goal is not just having good code.
+
+##### Abandoned or stale pull requests
+
+If a pull request appears to be abandoned or stalled, it is polite to first check with the contributor to see if they intend to continue the work before checking if they would mind if you took it over (especially if it just has nits left). When doing so, it is courteous to give the original contributor credit for the work they started, either by preserving their name and e-mail address in the commit log, or by using the `Author: ` or `Co-authored-by: ` metadata tag in the commits.
+
+_Adapted from the [ethers-rs contributing guide](https://github.com/gakonst/ethers-rs/blob/master/CONTRIBUTING.md)_.
+
+### Releasing
+
+Releases are automatically done by the release workflow when a tag is pushed, however, these steps still need to be taken:
+
+1. Ensure that the versions in the relevant `Cargo.toml` files are up-to-date.
+2. Update documentation links
+3. Perform a final audit for breaking changes.
+
+[rust-coc]: https://github.com/rust-lang/rust/blob/master/CODE_OF_CONDUCT.md
+[dev-tg]: https://t.me/foundry_rs
+[foundry-book]: https://github.com/foundry-rs/foundry-book
+[support-tg]: https://t.me/foundry_support
+[mcve]: https://stackoverflow.com/help/mcve
+[hiding-a-comment]: https://help.github.com/articles/managing-disruptive-comments/#hiding-a-comment
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/LICENSE-APACHE b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/LICENSE-APACHE
new file mode 100644
index 000000000..cf01a499f
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/LICENSE-APACHE
@@ -0,0 +1,203 @@
+Copyright Contributors to Forge Standard Library
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/LICENSE-MIT b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/LICENSE-MIT
new file mode 100644
index 000000000..28f98304a
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright Contributors to Forge Standard Library
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.R
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/README.md b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/README.md
new file mode 100644
index 000000000..8eb95bd8e
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/README.md
@@ -0,0 +1,268 @@
+# Forge Standard Library • [](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml)
+
+Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes.
+
+**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://getfoundry.sh/reference/forge-std/overview/).**
+
+## Install
+
+```bash
+forge install foundry-rs/forge-std
+```
+
+## Contracts
+
+### stdError
+
+This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler built-in errors.
+
+See the contract itself for all error codes.
+
+#### Example usage
+
+```solidity
+
+import "forge-std/Test.sol";
+
+contract TestContract is Test {
+ ErrorsTest test;
+
+ function setUp() public {
+ test = new ErrorsTest();
+ }
+
+ function testExpectArithmetic() public {
+ vm.expectRevert(stdError.arithmeticError);
+ test.arithmeticError(10);
+ }
+}
+
+contract ErrorsTest {
+ function arithmeticError(uint256 a) public {
+ a = a - 100;
+ }
+}
+```
+
+### stdStorage
+
+This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can _always_ find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`).
+
+This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth.
+
+I.e.:
+
+```solidity
+struct T {
+ // depth 0
+ uint256 a;
+ // depth 1
+ uint256 b;
+}
+```
+
+#### Example usage
+
+```solidity
+import "forge-std/Test.sol";
+
+contract TestContract is Test {
+ using stdStorage for StdStorage;
+
+ Storage test;
+
+ function setUp() public {
+ test = new Storage();
+ }
+
+ function testFindExists() public {
+ // Let's say we want to find the slot for the public
+ // variable `exists`. We just pass in the function selector
+ // to the `find` command
+ uint256 slot = stdstore.target(address(test)).sig("exists()").find();
+ assertEq(slot, 0);
+ }
+
+ function testWriteExists() public {
+ // Let's say we want to write to the slot for the public
+ // variable `exists`. We just pass in the function selector
+ // to the `checked_write` command
+ stdstore.target(address(test)).sig("exists()").checked_write(100);
+ assertEq(test.exists(), 100);
+ }
+
+ // It supports arbitrary storage layouts, like assembly based storage locations
+ function testFindHidden() public {
+ // `hidden` is a random hash of a bytes, iteration through slots would
+ // not find it. Our mechanism does
+ // Also, you can use the selector instead of a string
+ uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find();
+ assertEq(slot, uint256(keccak256("my.random.var")));
+ }
+
+ // If targeting a mapping, you have to pass in the keys necessary to perform the find
+ // i.e.:
+ function testFindMapping() public {
+ uint256 slot = stdstore
+ .target(address(test))
+ .sig(test.map_addr.selector)
+ .with_key(address(this))
+ .find();
+ // in the `Storage` constructor, we wrote that this address' value was 1 in the map
+ // so when we load the slot, we expect it to be 1
+ assertEq(uint(vm.load(address(test), bytes32(slot))), 1);
+ }
+
+ // If the target is a struct, you can specify the field depth:
+ function testFindStruct() public {
+ // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc.
+ uint256 slot_for_a_field = stdstore
+ .target(address(test))
+ .sig(test.basicStruct.selector)
+ .depth(0)
+ .find();
+
+ uint256 slot_for_b_field = stdstore
+ .target(address(test))
+ .sig(test.basicStruct.selector)
+ .depth(1)
+ .find();
+
+ assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1);
+ assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2);
+ }
+}
+
+// A complex storage contract
+contract Storage {
+ struct UnpackedStruct {
+ uint256 a;
+ uint256 b;
+ }
+
+ constructor() {
+ map_addr[msg.sender] = 1;
+ }
+
+ uint256 public exists = 1;
+ mapping(address => uint256) public map_addr;
+ // mapping(address => Packed) public map_packed;
+ mapping(address => UnpackedStruct) public map_struct;
+ mapping(address => mapping(address => uint256)) public deep_map;
+ mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct;
+ UnpackedStruct public basicStruct = UnpackedStruct({
+ a: 1,
+ b: 2
+ });
+
+ function hidden() public view returns (bytes32 t) {
+ // an extremely hidden storage slot
+ bytes32 slot = keccak256("my.random.var");
+ assembly {
+ t := sload(slot)
+ }
+ }
+}
+```
+
+### stdCheats
+
+This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for addresses that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you.
+
+#### Example usage:
+
+```solidity
+
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity ^0.8.0;
+
+import "forge-std/Test.sol";
+
+// Inherit the stdCheats
+contract StdCheatsTest is Test {
+ Bar test;
+ function setUp() public {
+ test = new Bar();
+ }
+
+ function testHoax() public {
+ // we call `hoax`, which gives the target address
+ // eth and then calls `prank`
+ hoax(address(1337));
+ test.bar{value: 100}(address(1337));
+
+ // overloaded to allow you to specify how much eth to
+ // initialize the address with
+ hoax(address(1337), 1);
+ test.bar{value: 1}(address(1337));
+ }
+
+ function testStartHoax() public {
+ // we call `startHoax`, which gives the target address
+ // eth and then calls `startPrank`
+ //
+ // it is also overloaded so that you can specify an eth amount
+ startHoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ test.bar{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+}
+
+contract Bar {
+ function bar(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ }
+}
+```
+
+### Std Assertions
+
+Contains various assertions.
+
+### `console.log`
+
+Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log).
+It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces.
+
+```solidity
+// import it indirectly via Test.sol
+import "forge-std/Test.sol";
+// or directly import it
+import "forge-std/console2.sol";
+...
+console2.log(someValue);
+```
+
+If you need compatibility with Hardhat, you must use the standard `console.sol` instead.
+Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces.
+
+```solidity
+// import it indirectly via Test.sol
+import "forge-std/Test.sol";
+// or directly import it
+import "forge-std/console.sol";
+...
+console.log(someValue);
+```
+
+## Contributing
+
+See our [contributing guidelines](./CONTRIBUTING.md).
+
+## Getting Help
+
+First, see if the answer to your question can be found in [book](https://getfoundry.sh/).
+
+If the answer is not there:
+
+- Join the [support Telegram](https://t.me/foundry_support) to get help, or
+- Open a [discussion](https://github.com/foundry-rs/foundry/discussions/new/choose) with your question, or
+- Open an issue with [the bug](https://github.com/foundry-rs/foundry/issues/new/choose)
+
+If you want to contribute, or follow along with contributor discussion, you can use our [main telegram](https://t.me/foundry_rs) to chat with us about the development of Foundry!
+
+## License
+
+Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license.
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/RELEASE_CHECKLIST.md b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/RELEASE_CHECKLIST.md
new file mode 100644
index 000000000..4611de4dc
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/RELEASE_CHECKLIST.md
@@ -0,0 +1,12 @@
+# Release checklist
+
+This checklist is meant to be used as a guide for the `forge-std` release process.
+
+## Steps
+
+- [ ] Update the version number in `package.json`
+- [ ] Open and merge a PR with the version bump
+- [ ] Tag the merged commit with the version number: `git tag v`
+- [ ] Push the tag to the repository: `git push --tags`
+- [ ] Create a new GitHub release with the automatically generated changelog and with the name set to `v`
+- [ ] Add `## Featured Changes` section to the top of the release notes
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/scripts/vm.py b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/scripts/vm.py
new file mode 100644
index 000000000..c79793b0d
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/scripts/vm.py
@@ -0,0 +1,636 @@
+#!/usr/bin/env python3
+
+import argparse
+import copy
+import json
+import re
+import subprocess
+from enum import Enum as PyEnum
+from pathlib import Path
+from typing import Callable
+from urllib import request
+
+VoidFn = Callable[[], None]
+
+CHEATCODES_JSON_URL = "https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json"
+OUT_PATH = "src/Vm.sol"
+
+VM_SAFE_DOC = """\
+/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may
+/// result in Script simulations differing from on-chain execution. It is recommended to only use
+/// these cheats in scripts.
+"""
+
+VM_DOC = """\
+/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used
+/// in tests, but it is not recommended to use these cheats in scripts.
+"""
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Generate Vm.sol based on the cheatcodes json created by Foundry")
+ parser.add_argument(
+ "--from",
+ metavar="PATH",
+ dest="path",
+ required=False,
+ help="path to a json file containing the Vm interface, as generated by Foundry")
+ args = parser.parse_args()
+ json_str = request.urlopen(CHEATCODES_JSON_URL).read().decode("utf-8") if args.path is None else Path(args.path).read_text()
+ contract = Cheatcodes.from_json(json_str)
+
+ ccs = contract.cheatcodes
+ ccs = list(filter(lambda cc: cc.status not in ["experimental", "internal"], ccs))
+ ccs.sort(key=lambda cc: cc.func.id)
+
+ safe = list(filter(lambda cc: cc.safety == "safe", ccs))
+ safe.sort(key=CmpCheatcode)
+ unsafe = list(filter(lambda cc: cc.safety == "unsafe", ccs))
+ unsafe.sort(key=CmpCheatcode)
+ assert len(safe) + len(unsafe) == len(ccs)
+
+ prefix_with_group_headers(safe)
+ prefix_with_group_headers(unsafe)
+
+ out = ""
+
+ out += "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n"
+
+ pp = CheatcodesPrinter(
+ spdx_identifier="MIT OR Apache-2.0",
+ solidity_requirement=">=0.8.13 <0.9.0",
+ )
+ pp.p_prelude()
+ pp.prelude = False
+ out += pp.finish()
+
+ out += "\n\n"
+ out += VM_SAFE_DOC
+ vm_safe = Cheatcodes(
+ # TODO: Custom errors were introduced in 0.8.4
+ errors=[], # contract.errors
+ events=contract.events,
+ enums=contract.enums,
+ structs=contract.structs,
+ cheatcodes=safe,
+ )
+ pp.p_contract(vm_safe, "VmSafe")
+ out += pp.finish()
+
+ out += "\n\n"
+ out += VM_DOC
+ vm_unsafe = Cheatcodes(
+ errors=[],
+ events=[],
+ enums=[],
+ structs=[],
+ cheatcodes=unsafe,
+ )
+ pp.p_contract(vm_unsafe, "Vm", "VmSafe")
+ out += pp.finish()
+
+ # Compatibility with <0.8.0
+ def memory_to_calldata(m: re.Match) -> str:
+ return " calldata " + m.group(1)
+
+ out = re.sub(r" memory (.*returns)", memory_to_calldata, out)
+
+ with open(OUT_PATH, "w") as f:
+ f.write(out)
+
+ forge_fmt = ["forge", "fmt", OUT_PATH]
+ res = subprocess.run(forge_fmt)
+ assert res.returncode == 0, f"command failed: {forge_fmt}"
+
+ print(f"Wrote to {OUT_PATH}")
+
+
+class CmpCheatcode:
+ cheatcode: "Cheatcode"
+
+ def __init__(self, cheatcode: "Cheatcode"):
+ self.cheatcode = cheatcode
+
+ def __lt__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) < 0
+
+ def __eq__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) == 0
+
+ def __gt__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) > 0
+
+
+def cmp_cheatcode(a: "Cheatcode", b: "Cheatcode") -> int:
+ if a.group != b.group:
+ return -1 if a.group < b.group else 1
+ if a.status != b.status:
+ return -1 if a.status < b.status else 1
+ if a.safety != b.safety:
+ return -1 if a.safety < b.safety else 1
+ if a.func.id != b.func.id:
+ return -1 if a.func.id < b.func.id else 1
+ return 0
+
+
+# HACK: A way to add group header comments without having to modify printer code
+def prefix_with_group_headers(cheats: list["Cheatcode"]):
+ s = set()
+ for i, cheat in enumerate(cheats):
+ if cheat.group in s:
+ continue
+
+ s.add(cheat.group)
+
+ c = copy.deepcopy(cheat)
+ c.func.description = ""
+ c.func.declaration = f"// ======== {group(c.group)} ========"
+ cheats.insert(i, c)
+ return cheats
+
+
+def group(s: str) -> str:
+ if s == "evm":
+ return "EVM"
+ if s == "json":
+ return "JSON"
+ return s[0].upper() + s[1:]
+
+
+class Visibility(PyEnum):
+ EXTERNAL: str = "external"
+ PUBLIC: str = "public"
+ INTERNAL: str = "internal"
+ PRIVATE: str = "private"
+
+ def __str__(self):
+ return self.value
+
+
+class Mutability(PyEnum):
+ PURE: str = "pure"
+ VIEW: str = "view"
+ NONE: str = ""
+
+ def __str__(self):
+ return self.value
+
+
+class Function:
+ id: str
+ description: str
+ declaration: str
+ visibility: Visibility
+ mutability: Mutability
+ signature: str
+ selector: str
+ selector_bytes: bytes
+
+ def __init__(
+ self,
+ id: str,
+ description: str,
+ declaration: str,
+ visibility: Visibility,
+ mutability: Mutability,
+ signature: str,
+ selector: str,
+ selector_bytes: bytes,
+ ):
+ self.id = id
+ self.description = description
+ self.declaration = declaration
+ self.visibility = visibility
+ self.mutability = mutability
+ self.signature = signature
+ self.selector = selector
+ self.selector_bytes = selector_bytes
+
+ @staticmethod
+ def from_dict(d: dict) -> "Function":
+ return Function(
+ d["id"],
+ d["description"],
+ d["declaration"],
+ Visibility(d["visibility"]),
+ Mutability(d["mutability"]),
+ d["signature"],
+ d["selector"],
+ bytes(d["selectorBytes"]),
+ )
+
+
+class Cheatcode:
+ func: Function
+ group: str
+ status: str
+ safety: str
+
+ def __init__(self, func: Function, group: str, status: str, safety: str):
+ self.func = func
+ self.group = group
+ self.status = status
+ self.safety = safety
+
+ @staticmethod
+ def from_dict(d: dict) -> "Cheatcode":
+ return Cheatcode(
+ Function.from_dict(d["func"]),
+ str(d["group"]),
+ str(d["status"]),
+ str(d["safety"]),
+ )
+
+
+class Error:
+ name: str
+ description: str
+ declaration: str
+
+ def __init__(self, name: str, description: str, declaration: str):
+ self.name = name
+ self.description = description
+ self.declaration = declaration
+
+ @staticmethod
+ def from_dict(d: dict) -> "Error":
+ return Error(**d)
+
+
+class Event:
+ name: str
+ description: str
+ declaration: str
+
+ def __init__(self, name: str, description: str, declaration: str):
+ self.name = name
+ self.description = description
+ self.declaration = declaration
+
+ @staticmethod
+ def from_dict(d: dict) -> "Event":
+ return Event(**d)
+
+
+class EnumVariant:
+ name: str
+ description: str
+
+ def __init__(self, name: str, description: str):
+ self.name = name
+ self.description = description
+
+
+class Enum:
+ name: str
+ description: str
+ variants: list[EnumVariant]
+
+ def __init__(self, name: str, description: str, variants: list[EnumVariant]):
+ self.name = name
+ self.description = description
+ self.variants = variants
+
+ @staticmethod
+ def from_dict(d: dict) -> "Enum":
+ return Enum(
+ d["name"],
+ d["description"],
+ list(map(lambda v: EnumVariant(**v), d["variants"])),
+ )
+
+
+class StructField:
+ name: str
+ ty: str
+ description: str
+
+ def __init__(self, name: str, ty: str, description: str):
+ self.name = name
+ self.ty = ty
+ self.description = description
+
+
+class Struct:
+ name: str
+ description: str
+ fields: list[StructField]
+
+ def __init__(self, name: str, description: str, fields: list[StructField]):
+ self.name = name
+ self.description = description
+ self.fields = fields
+
+ @staticmethod
+ def from_dict(d: dict) -> "Struct":
+ return Struct(
+ d["name"],
+ d["description"],
+ list(map(lambda f: StructField(**f), d["fields"])),
+ )
+
+
+class Cheatcodes:
+ errors: list[Error]
+ events: list[Event]
+ enums: list[Enum]
+ structs: list[Struct]
+ cheatcodes: list[Cheatcode]
+
+ def __init__(
+ self,
+ errors: list[Error],
+ events: list[Event],
+ enums: list[Enum],
+ structs: list[Struct],
+ cheatcodes: list[Cheatcode],
+ ):
+ self.errors = errors
+ self.events = events
+ self.enums = enums
+ self.structs = structs
+ self.cheatcodes = cheatcodes
+
+ @staticmethod
+ def from_dict(d: dict) -> "Cheatcodes":
+ return Cheatcodes(
+ errors=[Error.from_dict(e) for e in d["errors"]],
+ events=[Event.from_dict(e) for e in d["events"]],
+ enums=[Enum.from_dict(e) for e in d["enums"]],
+ structs=[Struct.from_dict(e) for e in d["structs"]],
+ cheatcodes=[Cheatcode.from_dict(e) for e in d["cheatcodes"]],
+ )
+
+ @staticmethod
+ def from_json(s) -> "Cheatcodes":
+ return Cheatcodes.from_dict(json.loads(s))
+
+ @staticmethod
+ def from_json_file(file_path: str) -> "Cheatcodes":
+ with open(file_path, "r") as f:
+ return Cheatcodes.from_dict(json.load(f))
+
+
+class Item(PyEnum):
+ ERROR: str = "error"
+ EVENT: str = "event"
+ ENUM: str = "enum"
+ STRUCT: str = "struct"
+ FUNCTION: str = "function"
+
+
+class ItemOrder:
+ _list: list[Item]
+
+ def __init__(self, list: list[Item]) -> None:
+ assert len(list) <= len(Item), "list must not contain more items than Item"
+ assert len(list) == len(set(list)), "list must not contain duplicates"
+ self._list = list
+ pass
+
+ def get_list(self) -> list[Item]:
+ return self._list
+
+ @staticmethod
+ def default() -> "ItemOrder":
+ return ItemOrder(
+ [
+ Item.ERROR,
+ Item.EVENT,
+ Item.ENUM,
+ Item.STRUCT,
+ Item.FUNCTION,
+ ]
+ )
+
+
+class CheatcodesPrinter:
+ buffer: str
+
+ prelude: bool
+ spdx_identifier: str
+ solidity_requirement: str
+
+ block_doc_style: bool
+
+ indent_level: int
+ _indent_str: str
+
+ nl_str: str
+
+ items_order: ItemOrder
+
+ def __init__(
+ self,
+ buffer: str = "",
+ prelude: bool = True,
+ spdx_identifier: str = "UNLICENSED",
+ solidity_requirement: str = "",
+ block_doc_style: bool = False,
+ indent_level: int = 0,
+ indent_with: int | str = 4,
+ nl_str: str = "\n",
+ items_order: ItemOrder = ItemOrder.default(),
+ ):
+ self.prelude = prelude
+ self.spdx_identifier = spdx_identifier
+ self.solidity_requirement = solidity_requirement
+ self.block_doc_style = block_doc_style
+ self.buffer = buffer
+ self.indent_level = indent_level
+ self.nl_str = nl_str
+
+ if isinstance(indent_with, int):
+ assert indent_with >= 0
+ self._indent_str = " " * indent_with
+ elif isinstance(indent_with, str):
+ self._indent_str = indent_with
+ else:
+ assert False, "indent_with must be int or str"
+
+ self.items_order = items_order
+
+ def finish(self) -> str:
+ ret = self.buffer.rstrip()
+ self.buffer = ""
+ return ret
+
+ def p_contract(self, contract: Cheatcodes, name: str, inherits: str = ""):
+ if self.prelude:
+ self.p_prelude(contract)
+
+ self._p_str("interface ")
+ name = name.strip()
+ if name != "":
+ self._p_str(name)
+ self._p_str(" ")
+ if inherits != "":
+ self._p_str("is ")
+ self._p_str(inherits)
+ self._p_str(" ")
+ self._p_str("{")
+ self._p_nl()
+ self._with_indent(lambda: self._p_items(contract))
+ self._p_str("}")
+ self._p_nl()
+
+ def _p_items(self, contract: Cheatcodes):
+ for item in self.items_order.get_list():
+ if item == Item.ERROR:
+ self.p_errors(contract.errors)
+ elif item == Item.EVENT:
+ self.p_events(contract.events)
+ elif item == Item.ENUM:
+ self.p_enums(contract.enums)
+ elif item == Item.STRUCT:
+ self.p_structs(contract.structs)
+ elif item == Item.FUNCTION:
+ self.p_functions(contract.cheatcodes)
+ else:
+ assert False, f"unknown item {item}"
+
+ def p_prelude(self, contract: Cheatcodes | None = None):
+ self._p_str(f"// SPDX-License-Identifier: {self.spdx_identifier}")
+ self._p_nl()
+
+ if self.solidity_requirement != "":
+ req = self.solidity_requirement
+ else:
+ req = ">=0.8.13 <0.9.0"
+ self._p_str(f"pragma solidity {req};")
+ self._p_nl()
+
+ self._p_nl()
+
+ def p_errors(self, errors: list[Error]):
+ for error in errors:
+ self._p_line(lambda: self.p_error(error))
+
+ def p_error(self, error: Error):
+ self._p_comment(error.description, doc=True)
+ self._p_line(lambda: self._p_str(error.declaration))
+
+ def p_events(self, events: list[Event]):
+ for event in events:
+ self._p_line(lambda: self.p_event(event))
+
+ def p_event(self, event: Event):
+ self._p_comment(event.description, doc=True)
+ self._p_line(lambda: self._p_str(event.declaration))
+
+ def p_enums(self, enums: list[Enum]):
+ for enum in enums:
+ self._p_line(lambda: self.p_enum(enum))
+
+ def p_enum(self, enum: Enum):
+ self._p_comment(enum.description, doc=True)
+ self._p_line(lambda: self._p_str(f"enum {enum.name} {{"))
+ self._with_indent(lambda: self.p_enum_variants(enum.variants))
+ self._p_line(lambda: self._p_str("}"))
+
+ def p_enum_variants(self, variants: list[EnumVariant]):
+ for i, variant in enumerate(variants):
+ self._p_indent()
+ self._p_comment(variant.description)
+
+ self._p_indent()
+ self._p_str(variant.name)
+ if i < len(variants) - 1:
+ self._p_str(",")
+ self._p_nl()
+
+ def p_structs(self, structs: list[Struct]):
+ for struct in structs:
+ self._p_line(lambda: self.p_struct(struct))
+
+ def p_struct(self, struct: Struct):
+ self._p_comment(struct.description, doc=True)
+ self._p_line(lambda: self._p_str(f"struct {struct.name} {{"))
+ self._with_indent(lambda: self.p_struct_fields(struct.fields))
+ self._p_line(lambda: self._p_str("}"))
+
+ def p_struct_fields(self, fields: list[StructField]):
+ for field in fields:
+ self._p_line(lambda: self.p_struct_field(field))
+
+ def p_struct_field(self, field: StructField):
+ self._p_comment(field.description)
+ self._p_indented(lambda: self._p_str(f"{field.ty} {field.name};"))
+
+ def p_functions(self, cheatcodes: list[Cheatcode]):
+ for cheatcode in cheatcodes:
+ self._p_line(lambda: self.p_function(cheatcode.func))
+
+ def p_function(self, func: Function):
+ self._p_comment(func.description, doc=True)
+ self._p_line(lambda: self._p_str(func.declaration))
+
+ def _p_comment(self, s: str, doc: bool = False):
+ s = s.strip()
+ if s == "":
+ return
+
+ s = map(lambda line: line.lstrip(), s.split("\n"))
+ if self.block_doc_style:
+ self._p_str("/*")
+ if doc:
+ self._p_str("*")
+ self._p_nl()
+ for line in s:
+ self._p_indent()
+ self._p_str(" ")
+ if doc:
+ self._p_str("* ")
+ self._p_str(line)
+ self._p_nl()
+ self._p_indent()
+ self._p_str(" */")
+ self._p_nl()
+ else:
+ first_line = True
+ for line in s:
+ if not first_line:
+ self._p_indent()
+ first_line = False
+
+ if doc:
+ self._p_str("/// ")
+ else:
+ self._p_str("// ")
+ self._p_str(line)
+ self._p_nl()
+
+ def _with_indent(self, f: VoidFn):
+ self._inc_indent()
+ f()
+ self._dec_indent()
+
+ def _p_line(self, f: VoidFn):
+ self._p_indent()
+ f()
+ self._p_nl()
+
+ def _p_indented(self, f: VoidFn):
+ self._p_indent()
+ f()
+
+ def _p_indent(self):
+ for _ in range(self.indent_level):
+ self._p_str(self._indent_str)
+
+ def _p_nl(self):
+ self._p_str(self.nl_str)
+
+ def _p_str(self, txt: str):
+ self.buffer += txt
+
+ def _inc_indent(self):
+ self.indent_level += 1
+
+ def _dec_indent(self):
+ self.indent_level -= 1
+
+
+if __name__ == "__main__":
+ main()
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Base.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Base.sol
new file mode 100644
index 000000000..d948010fe
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Base.sol
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {StdStorage} from "./StdStorage.sol";
+import {Vm, VmSafe} from "./Vm.sol";
+
+abstract contract CommonBase {
+ /// @dev Cheat code address.
+ /// Calculated as `address(uint160(uint256(keccak256("hevm cheat code"))))`.
+ address internal constant VM_ADDRESS = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D;
+
+ /// @dev console.sol and console2.sol work by executing a staticcall to this address.
+ /// Calculated as `address(uint160(uint88(bytes11("console.log"))))`.
+ address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;
+
+ /// @dev Used when deploying with create2.
+ /// Taken from https://github.com/Arachnid/deterministic-deployment-proxy.
+ address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+
+ /// @dev The default address for tx.origin and msg.sender.
+ /// Calculated as `address(uint160(uint256(keccak256("foundry default caller"))))`.
+ address internal constant DEFAULT_SENDER = 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38;
+
+ /// @dev The address of the first contract `CREATE`d by a running test contract.
+ /// When running tests, each test contract is `CREATE`d by `DEFAULT_SENDER` with nonce 1.
+ /// Calculated as `VM.computeCreateAddress(VM.computeCreateAddress(DEFAULT_SENDER, 1), 1)`.
+ address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;
+
+ /// @dev Deterministic deployment address of the Multicall3 contract.
+ /// Taken from https://www.multicall3.com.
+ address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;
+
+ /// @dev The order of the secp256k1 curve.
+ uint256 internal constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+
+ uint256 internal constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ Vm internal constant vm = Vm(VM_ADDRESS);
+ StdStorage internal stdstore;
+}
+
+abstract contract TestBase is CommonBase {}
+
+abstract contract ScriptBase is CommonBase {
+ VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Config.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Config.sol
new file mode 100644
index 000000000..3d35bb583
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Config.sol
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity ^0.8.13;
+
+import {console} from "./console.sol";
+import {StdConfig} from "./StdConfig.sol";
+import {CommonBase} from "./Base.sol";
+
+/// @notice Boilerplate to streamline the setup of multi-chain environments.
+abstract contract Config is CommonBase {
+ // -- STORAGE (CONFIG + CHAINS + FORKS) ------------------------------------
+
+ /// @dev Contract instance holding the data from the TOML config file.
+ StdConfig internal config;
+
+ /// @dev Array of chain IDs for which forks have been created.
+ uint256[] internal chainIds;
+
+ /// @dev A mapping from a chain ID to its initialized fork ID.
+ mapping(uint256 => uint256) internal forkOf;
+
+ // -- HELPER FUNCTIONS -----------------------------------------------------
+
+ /// @notice Loads configuration from a file.
+ ///
+ /// @dev This function instantiates a `Config` contract, caching all its config variables.
+ ///
+ /// @param filePath: the path to the TOML configuration file.
+ /// @param writeToFile: whether updates are written back to the TOML file.
+ function _loadConfig(string memory filePath, bool writeToFile) internal {
+ console.log("----------");
+ console.log(string.concat("Loading config from '", filePath, "'"));
+ config = new StdConfig(filePath, writeToFile);
+ vm.makePersistent(address(config));
+ console.log("Config successfully loaded");
+ console.log("----------");
+ }
+
+ /// @notice Loads configuration from a file and creates forks for each specified chain.
+ ///
+ /// @dev This function instantiates a `Config` contract, caching all its config variables,
+ /// reads the configured chain ids, and iterates through them to create a fork for each one.
+ /// It also creates a map `forkOf[chainId] -> forkId` to easily switch between forks.
+ ///
+ /// @param filePath: the path to the TOML configuration file.
+ /// @param writeToFile: whether updates are written back to the TOML file.
+ function _loadConfigAndForks(string memory filePath, bool writeToFile) internal {
+ _loadConfig(filePath, writeToFile);
+
+ console.log("Setting up forks for the configured chains...");
+ uint256[] memory chains = config.getChainIds();
+ for (uint256 i = 0; i < chains.length; i++) {
+ uint256 chainId = chains[i];
+ uint256 forkId = vm.createFork(config.getRpcUrl(chainId));
+ forkOf[chainId] = forkId;
+ chainIds.push(chainId);
+ }
+ console.log("Forks successfully created");
+ console.log("----------");
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/LibVariable.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/LibVariable.sol
new file mode 100644
index 000000000..32fe5bfa9
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/LibVariable.sol
@@ -0,0 +1,477 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity ^0.8.13;
+
+// Enable globally.
+using LibVariable for Variable global;
+
+struct Variable {
+ Type ty;
+ bytes data;
+}
+
+struct Type {
+ TypeKind kind;
+ bool isArray;
+}
+
+enum TypeKind {
+ None,
+ Bool,
+ Address,
+ Bytes32,
+ Uint256,
+ Int256,
+ String,
+ Bytes
+}
+
+/// @notice Library for type-safe coercion of the `Variable` struct to concrete types.
+///
+/// @dev Ensures that when a `Variable` is cast to a concrete Solidity type, the operation is safe and the
+/// underlying type matches what is expected.
+/// Provides functions to check types, convert them to strings, and coerce `Variable` instances into
+/// both single values and arrays of various types.
+///
+/// Usage example:
+/// ```solidity
+/// import {LibVariable} from "./LibVariable.sol";
+///
+/// contract MyContract {
+/// using LibVariable for Variable;
+/// StdConfig config; // Assume 'config' is an instance of `StdConfig` and has already been loaded.
+///
+/// function readValues() public {
+/// // Retrieve a 'uint256' value from the config.
+/// uint256 myNumber = config.get("important_number").toUint256();
+///
+/// // Would revert with `TypeMismatch` as 'important_number' isn't a `uint256` in the config file.
+/// // string memory notANumber = config.get("important_number").toString();
+///
+/// // Retrieve a address array from the config.
+/// address[] memory admins = config.get("whitelisted_admins").toAddressArray();
+/// }
+/// }
+/// ```
+library LibVariable {
+ error NotInitialized();
+ error TypeMismatch(string expected, string actual);
+ error UnsafeCast(string message);
+
+ // -- TYPE HELPERS ----------------------------------------------------
+
+ /// @notice Compares two Type instances for equality.
+ function isEqual(Type memory self, Type memory other) internal pure returns (bool) {
+ return self.kind == other.kind && self.isArray == other.isArray;
+ }
+
+ /// @notice Compares two Type instances for equality. Reverts if they are not equal.
+ function assertEq(Type memory self, Type memory other) internal pure {
+ if (!isEqual(self, other)) {
+ revert TypeMismatch(toString(other), toString(self));
+ }
+ }
+
+ /// @notice Converts a Type struct to its full string representation (i.e. "uint256[]").
+ function toString(Type memory self) internal pure returns (string memory) {
+ string memory tyStr = toString(self.kind);
+ if (!self.isArray || self.kind == TypeKind.None) {
+ return tyStr;
+ } else {
+ return string.concat(tyStr, "[]");
+ }
+ }
+
+ /// @dev Converts a `TypeKind` enum to its base string representation.
+ function toString(TypeKind self) internal pure returns (string memory) {
+ if (self == TypeKind.Bool) return "bool";
+ if (self == TypeKind.Address) return "address";
+ if (self == TypeKind.Bytes32) return "bytes32";
+ if (self == TypeKind.Uint256) return "uint256";
+ if (self == TypeKind.Int256) return "int256";
+ if (self == TypeKind.String) return "string";
+ if (self == TypeKind.Bytes) return "bytes";
+ return "none";
+ }
+
+ /// @dev Converts a `TypeKind` enum to its base string representation.
+ function toTomlKey(TypeKind self) internal pure returns (string memory) {
+ if (self == TypeKind.Bool) return "bool";
+ if (self == TypeKind.Address) return "address";
+ if (self == TypeKind.Bytes32) return "bytes32";
+ if (self == TypeKind.Uint256) return "uint";
+ if (self == TypeKind.Int256) return "int";
+ if (self == TypeKind.String) return "string";
+ if (self == TypeKind.Bytes) return "bytes";
+ return "none";
+ }
+
+ // -- VARIABLE HELPERS ----------------------------------------------------
+
+ /// @dev Checks if a `Variable` has been initialized and matches the expected type reverting if not.
+ modifier check(Variable memory self, Type memory expected) {
+ assertExists(self);
+ assertEq(self.ty, expected);
+ _;
+ }
+
+ /// @dev Checks if a `Variable` has been initialized, reverting if not.
+ function assertExists(Variable memory self) public pure {
+ if (self.ty.kind == TypeKind.None) {
+ revert NotInitialized();
+ }
+ }
+
+ // -- VARIABLE COERCION FUNCTIONS (SINGLE VALUES) --------------------------
+
+ /// @notice Coerces a `Variable` to a `bool` value.
+ function toBool(Variable memory self) internal pure check(self, Type(TypeKind.Bool, false)) returns (bool) {
+ return abi.decode(self.data, (bool));
+ }
+
+ /// @notice Coerces a `Variable` to an `address` value.
+ function toAddress(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Address, false))
+ returns (address)
+ {
+ return abi.decode(self.data, (address));
+ }
+
+ /// @notice Coerces a `Variable` to a `bytes32` value.
+ function toBytes32(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bytes32, false))
+ returns (bytes32)
+ {
+ return abi.decode(self.data, (bytes32));
+ }
+
+ /// @notice Coerces a `Variable` to a `uint256` value.
+ function toUint256(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Uint256, false))
+ returns (uint256)
+ {
+ return abi.decode(self.data, (uint256));
+ }
+
+ /// @notice Coerces a `Variable` to a `uint128` value, checking for overflow.
+ function toUint128(Variable memory self) internal pure returns (uint128) {
+ uint256 value = self.toUint256();
+ if (value > type(uint128).max) {
+ revert UnsafeCast("value does not fit in 'uint128'");
+ }
+ return uint128(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `uint64` value, checking for overflow.
+ function toUint64(Variable memory self) internal pure returns (uint64) {
+ uint256 value = self.toUint256();
+ if (value > type(uint64).max) {
+ revert UnsafeCast("value does not fit in 'uint64'");
+ }
+ return uint64(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `uint32` value, checking for overflow.
+ function toUint32(Variable memory self) internal pure returns (uint32) {
+ uint256 value = self.toUint256();
+ if (value > type(uint32).max) {
+ revert UnsafeCast("value does not fit in 'uint32'");
+ }
+ return uint32(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `uint16` value, checking for overflow.
+ function toUint16(Variable memory self) internal pure returns (uint16) {
+ uint256 value = self.toUint256();
+ if (value > type(uint16).max) {
+ revert UnsafeCast("value does not fit in 'uint16'");
+ }
+ return uint16(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `uint8` value, checking for overflow.
+ function toUint8(Variable memory self) internal pure returns (uint8) {
+ uint256 value = self.toUint256();
+ if (value > type(uint8).max) {
+ revert UnsafeCast("value does not fit in 'uint8'");
+ }
+ return uint8(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int256` value.
+ function toInt256(Variable memory self) internal pure check(self, Type(TypeKind.Int256, false)) returns (int256) {
+ return abi.decode(self.data, (int256));
+ }
+
+ /// @notice Coerces a `Variable` to an `int128` value, checking for overflow/underflow.
+ function toInt128(Variable memory self) internal pure returns (int128) {
+ int256 value = self.toInt256();
+ if (value > type(int128).max || value < type(int128).min) {
+ revert UnsafeCast("value does not fit in 'int128'");
+ }
+ return int128(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int64` value, checking for overflow/underflow.
+ function toInt64(Variable memory self) internal pure returns (int64) {
+ int256 value = self.toInt256();
+ if (value > type(int64).max || value < type(int64).min) {
+ revert UnsafeCast("value does not fit in 'int64'");
+ }
+ return int64(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int32` value, checking for overflow/underflow.
+ function toInt32(Variable memory self) internal pure returns (int32) {
+ int256 value = self.toInt256();
+ if (value > type(int32).max || value < type(int32).min) {
+ revert UnsafeCast("value does not fit in 'int32'");
+ }
+ return int32(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int16` value, checking for overflow/underflow.
+ function toInt16(Variable memory self) internal pure returns (int16) {
+ int256 value = self.toInt256();
+ if (value > type(int16).max || value < type(int16).min) {
+ revert UnsafeCast("value does not fit in 'int16'");
+ }
+ return int16(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int8` value, checking for overflow/underflow.
+ function toInt8(Variable memory self) internal pure returns (int8) {
+ int256 value = self.toInt256();
+ if (value > type(int8).max || value < type(int8).min) {
+ revert UnsafeCast("value does not fit in 'int8'");
+ }
+ return int8(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `string` value.
+ function toString(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.String, false))
+ returns (string memory)
+ {
+ return abi.decode(self.data, (string));
+ }
+
+ /// @notice Coerces a `Variable` to a `bytes` value.
+ function toBytes(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bytes, false))
+ returns (bytes memory)
+ {
+ return abi.decode(self.data, (bytes));
+ }
+
+ // -- VARIABLE COERCION FUNCTIONS (ARRAYS) ---------------------------------
+
+ /// @notice Coerces a `Variable` to a `bool` array.
+ function toBoolArray(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bool, true))
+ returns (bool[] memory)
+ {
+ return abi.decode(self.data, (bool[]));
+ }
+
+ /// @notice Coerces a `Variable` to an `address` array.
+ function toAddressArray(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Address, true))
+ returns (address[] memory)
+ {
+ return abi.decode(self.data, (address[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `bytes32` array.
+ function toBytes32Array(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bytes32, true))
+ returns (bytes32[] memory)
+ {
+ return abi.decode(self.data, (bytes32[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `uint256` array.
+ function toUint256Array(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Uint256, true))
+ returns (uint256[] memory)
+ {
+ return abi.decode(self.data, (uint256[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `uint128` array, checking for overflow.
+ function toUint128Array(Variable memory self) internal pure returns (uint128[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint128[] memory result = new uint128[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint128).max) {
+ revert UnsafeCast("value in array does not fit in 'uint128'");
+ }
+ result[i] = uint128(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `uint64` array, checking for overflow.
+ function toUint64Array(Variable memory self) internal pure returns (uint64[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint64[] memory result = new uint64[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint64).max) {
+ revert UnsafeCast("value in array does not fit in 'uint64'");
+ }
+ result[i] = uint64(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `uint32` array, checking for overflow.
+ function toUint32Array(Variable memory self) internal pure returns (uint32[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint32[] memory result = new uint32[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint32).max) {
+ revert UnsafeCast("value in array does not fit in 'uint32'");
+ }
+ result[i] = uint32(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `uint16` array, checking for overflow.
+ function toUint16Array(Variable memory self) internal pure returns (uint16[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint16[] memory result = new uint16[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint16).max) {
+ revert UnsafeCast("value in array does not fit in 'uint16'");
+ }
+ result[i] = uint16(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `uint8` array, checking for overflow.
+ function toUint8Array(Variable memory self) internal pure returns (uint8[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint8[] memory result = new uint8[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint8).max) {
+ revert UnsafeCast("value in array does not fit in 'uint8'");
+ }
+ result[i] = uint8(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to an `int256` array.
+ function toInt256Array(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Int256, true))
+ returns (int256[] memory)
+ {
+ return abi.decode(self.data, (int256[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `int128` array, checking for overflow/underflow.
+ function toInt128Array(Variable memory self) internal pure returns (int128[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int128[] memory result = new int128[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int128).max || values[i] < type(int128).min) {
+ revert UnsafeCast("value in array does not fit in 'int128'");
+ }
+ result[i] = int128(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `int64` array, checking for overflow/underflow.
+ function toInt64Array(Variable memory self) internal pure returns (int64[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int64[] memory result = new int64[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int64).max || values[i] < type(int64).min) {
+ revert UnsafeCast("value in array does not fit in 'int64'");
+ }
+ result[i] = int64(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `int32` array, checking for overflow/underflow.
+ function toInt32Array(Variable memory self) internal pure returns (int32[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int32[] memory result = new int32[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int32).max || values[i] < type(int32).min) {
+ revert UnsafeCast("value in array does not fit in 'int32'");
+ }
+ result[i] = int32(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `int16` array, checking for overflow/underflow.
+ function toInt16Array(Variable memory self) internal pure returns (int16[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int16[] memory result = new int16[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int16).max || values[i] < type(int16).min) {
+ revert UnsafeCast("value in array does not fit in 'int16'");
+ }
+ result[i] = int16(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `int8` array, checking for overflow/underflow.
+ function toInt8Array(Variable memory self) internal pure returns (int8[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int8[] memory result = new int8[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int8).max || values[i] < type(int8).min) {
+ revert UnsafeCast("value in array does not fit in 'int8'");
+ }
+ result[i] = int8(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `string` array.
+ function toStringArray(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.String, true))
+ returns (string[] memory)
+ {
+ return abi.decode(self.data, (string[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `bytes` array.
+ function toBytesArray(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bytes, true))
+ returns (bytes[] memory)
+ {
+ return abi.decode(self.data, (bytes[]));
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Script.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Script.sol
new file mode 100644
index 000000000..d43fa8a7a
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Script.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+// 💬 ABOUT
+// Forge Std's default Script.
+
+// 🧩 MODULES
+import {console} from "./console.sol";
+import {console2} from "./console2.sol";
+import {safeconsole} from "./safeconsole.sol";
+import {StdChains} from "./StdChains.sol";
+import {StdCheatsSafe} from "./StdCheats.sol";
+import {StdConstants} from "./StdConstants.sol";
+import {stdJson} from "./StdJson.sol";
+import {stdMath} from "./StdMath.sol";
+import {StdStorage, stdStorageSafe} from "./StdStorage.sol";
+import {StdStyle} from "./StdStyle.sol";
+import {StdUtils} from "./StdUtils.sol";
+import {VmSafe} from "./Vm.sol";
+
+// 📦 BOILERPLATE
+import {ScriptBase} from "./Base.sol";
+
+// ⭐️ SCRIPT
+abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils {
+ // Note: IS_SCRIPT() must return true.
+ bool public IS_SCRIPT = true;
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdAssertions.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdAssertions.sol
new file mode 100644
index 000000000..96d13964f
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdAssertions.sol
@@ -0,0 +1,779 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Vm} from "./Vm.sol";
+
+abstract contract StdAssertions {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ event log(string);
+ event logs(bytes);
+
+ event log_address(address);
+ event log_bytes32(bytes32);
+ event log_int(int256);
+ event log_uint(uint256);
+ event log_bytes(bytes);
+ event log_string(string);
+
+ event log_named_address(string key, address val);
+ event log_named_bytes32(string key, bytes32 val);
+ event log_named_decimal_int(string key, int256 val, uint256 decimals);
+ event log_named_decimal_uint(string key, uint256 val, uint256 decimals);
+ event log_named_int(string key, int256 val);
+ event log_named_uint(string key, uint256 val);
+ event log_named_bytes(string key, bytes val);
+ event log_named_string(string key, string val);
+
+ event log_array(uint256[] val);
+ event log_array(int256[] val);
+ event log_array(address[] val);
+ event log_named_array(string key, uint256[] val);
+ event log_named_array(string key, int256[] val);
+ event log_named_array(string key, address[] val);
+
+ bytes32 private constant FAILED_SLOT = bytes32("failed");
+
+ bool private _failed;
+
+ function failed() public view returns (bool) {
+ if (_failed) {
+ return true;
+ } else {
+ return vm.load(address(vm), FAILED_SLOT) != bytes32(0);
+ }
+ }
+
+ function fail() internal virtual {
+ vm.store(address(vm), FAILED_SLOT, bytes32(uint256(1)));
+ _failed = true;
+ }
+
+ function fail(string memory message) internal virtual {
+ fail();
+ vm.assertTrue(false, message);
+ }
+
+ function assertTrue(bool data) internal pure virtual {
+ if (!data) {
+ vm.assertTrue(data);
+ }
+ }
+
+ function assertTrue(bool data, string memory err) internal pure virtual {
+ if (!data) {
+ vm.assertTrue(data, err);
+ }
+ }
+
+ function assertFalse(bool data) internal pure virtual {
+ if (data) {
+ vm.assertFalse(data);
+ }
+ }
+
+ function assertFalse(bool data, string memory err) internal pure virtual {
+ if (data) {
+ vm.assertFalse(data, err);
+ }
+ }
+
+ function assertEq(bool left, bool right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(bool left, bool right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEq(uint256 left, uint256 right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals);
+ }
+
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals, err);
+ }
+
+ function assertEq(int256 left, int256 right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals);
+ }
+
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals, err);
+ }
+
+ function assertEq(address left, address right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(address left, address right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEq(bytes32 left, bytes32 right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEq32(bytes32 left, bytes32 right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEq(string memory left, string memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(string memory left, string memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes memory left, bytes memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bool[] memory left, bool[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(int256[] memory left, int256[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(address[] memory left, address[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(string[] memory left, string[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ // Legacy helper
+ function assertEqUint(uint256 left, uint256 right) internal pure virtual {
+ assertEq(left, right);
+ }
+
+ function assertNotEq(bool left, bool right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(bool left, bool right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEq(uint256 left, uint256 right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals);
+ }
+
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err)
+ internal
+ pure
+ virtual
+ {
+ vm.assertNotEqDecimal(left, right, decimals, err);
+ }
+
+ function assertNotEq(int256 left, int256 right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals);
+ }
+
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals, err);
+ }
+
+ function assertNotEq(address left, address right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(address left, address right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEq(bytes32 left, bytes32 right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEq(string memory left, string memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes memory left, bytes memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(address[] memory left, address[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(string[] memory left, string[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertLt(uint256 left, uint256 right) internal pure virtual {
+ if (left >= right) {
+ vm.assertLt(left, right);
+ }
+ }
+
+ function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left >= right) {
+ vm.assertLt(left, right, err);
+ }
+ }
+
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals);
+ }
+
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals, err);
+ }
+
+ function assertLt(int256 left, int256 right) internal pure virtual {
+ if (left >= right) {
+ vm.assertLt(left, right);
+ }
+ }
+
+ function assertLt(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left >= right) {
+ vm.assertLt(left, right, err);
+ }
+ }
+
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals);
+ }
+
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals, err);
+ }
+
+ function assertGt(uint256 left, uint256 right) internal pure virtual {
+ if (left <= right) {
+ vm.assertGt(left, right);
+ }
+ }
+
+ function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left <= right) {
+ vm.assertGt(left, right, err);
+ }
+ }
+
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals);
+ }
+
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals, err);
+ }
+
+ function assertGt(int256 left, int256 right) internal pure virtual {
+ if (left <= right) {
+ vm.assertGt(left, right);
+ }
+ }
+
+ function assertGt(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left <= right) {
+ vm.assertGt(left, right, err);
+ }
+ }
+
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals);
+ }
+
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals, err);
+ }
+
+ function assertLe(uint256 left, uint256 right) internal pure virtual {
+ if (left > right) {
+ vm.assertLe(left, right);
+ }
+ }
+
+ function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left > right) {
+ vm.assertLe(left, right, err);
+ }
+ }
+
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals);
+ }
+
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals, err);
+ }
+
+ function assertLe(int256 left, int256 right) internal pure virtual {
+ if (left > right) {
+ vm.assertLe(left, right);
+ }
+ }
+
+ function assertLe(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left > right) {
+ vm.assertLe(left, right, err);
+ }
+ }
+
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals);
+ }
+
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals, err);
+ }
+
+ function assertGe(uint256 left, uint256 right) internal pure virtual {
+ if (left < right) {
+ vm.assertGe(left, right);
+ }
+ }
+
+ function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left < right) {
+ vm.assertGe(left, right, err);
+ }
+ }
+
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals);
+ }
+
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals, err);
+ }
+
+ function assertGe(int256 left, int256 right) internal pure virtual {
+ if (left < right) {
+ vm.assertGe(left, right);
+ }
+ }
+
+ function assertGe(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left < right) {
+ vm.assertGe(left, right, err);
+ }
+ }
+
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals);
+ }
+
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals, err);
+ }
+
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta);
+ }
+
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta, err);
+ }
+
+ function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);
+ }
+
+ function assertApproxEqAbsDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);
+ }
+
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta);
+ }
+
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta, err);
+ }
+
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);
+ }
+
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);
+ }
+
+ function assertApproxEqRel(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%
+ )
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqRel(left, right, maxPercentDelta);
+ }
+
+ function assertApproxEqRel(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ string memory err
+ )
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqRel(left, right, maxPercentDelta, err);
+ }
+
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals
+ )
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);
+ }
+
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);
+ }
+
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta);
+ }
+
+ function assertApproxEqRel(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ string memory err
+ )
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqRel(left, right, maxPercentDelta, err);
+ }
+
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals
+ )
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);
+ }
+
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);
+ }
+
+ // Inherited from DSTest, not used but kept for backwards-compatibility
+ function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) {
+ return keccak256(left) == keccak256(right);
+ }
+
+ function assertEq0(bytes memory left, bytes memory right) internal pure virtual {
+ assertEq(left, right);
+ }
+
+ function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ assertEq(left, right, err);
+ }
+
+ function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual {
+ assertNotEq(left, right);
+ }
+
+ function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ assertNotEq(left, right, err);
+ }
+
+ function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {
+ assertEqCall(target, callDataA, target, callDataB, true);
+ }
+
+ function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)
+ internal
+ virtual
+ {
+ assertEqCall(targetA, callDataA, targetB, callDataB, true);
+ }
+
+ function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)
+ internal
+ virtual
+ {
+ assertEqCall(target, callDataA, target, callDataB, strictRevertData);
+ }
+
+ function assertEqCall(
+ address targetA,
+ bytes memory callDataA,
+ address targetB,
+ bytes memory callDataB,
+ bool strictRevertData
+ ) internal virtual {
+ (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);
+ (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);
+
+ if (successA && successB) {
+ assertEq(returnDataA, returnDataB, "Call return data does not match");
+ }
+
+ if (!successA && !successB && strictRevertData) {
+ assertEq(returnDataA, returnDataB, "Call revert data does not match");
+ }
+
+ if (!successA && successB) {
+ emit log("Error: Calls were not equal");
+ emit log_named_bytes(" Left call revert data", returnDataA);
+ emit log_named_bytes(" Right call return data", returnDataB);
+ revert("assertion failed");
+ }
+
+ if (successA && !successB) {
+ emit log("Error: Calls were not equal");
+ emit log_named_bytes(" Left call return data", returnDataA);
+ emit log_named_bytes(" Right call revert data", returnDataB);
+ revert("assertion failed");
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdChains.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdChains.sol
new file mode 100644
index 000000000..e34166c02
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdChains.sol
@@ -0,0 +1,295 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {VmSafe} from "./Vm.sol";
+
+/**
+ * StdChains provides information about EVM compatible chains that can be used in scripts/tests.
+ * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are
+ * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of
+ * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the
+ * alias used in this contract, which can be found as the first argument to the
+ * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.
+ *
+ * There are two main ways to use this contract:
+ * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or
+ * `setChain(string memory chainAlias, Chain memory chain)`
+ * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.
+ *
+ * The first time either of those are used, chains are initialized with the default set of RPC URLs.
+ * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in
+ * `defaultRpcUrls`.
+ *
+ * The `setChain` function is straightforward, and it simply saves off the given chain data.
+ *
+ * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say
+ * we want to retrieve the RPC URL for `mainnet`:
+ * - If you have specified data with `setChain`, it will return that.
+ * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it
+ * is valid (e.g. a URL is specified, or an environment variable is given and exists).
+ * - If neither of the above conditions is met, the default data is returned.
+ *
+ * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.
+ */
+abstract contract StdChains {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ bool private stdChainsInitialized;
+
+ struct ChainData {
+ string name;
+ uint256 chainId;
+ string rpcUrl;
+ }
+
+ struct Chain {
+ // The chain name.
+ string name;
+ // The chain's Chain ID.
+ uint256 chainId;
+ // The chain's alias. (i.e. what gets specified in `foundry.toml`).
+ string chainAlias;
+ // A default RPC endpoint for this chain.
+ // NOTE: This default RPC URL is included for convenience to facilitate quick tests and
+ // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy
+ // usage as you will be throttled and this is a disservice to others who need this endpoint.
+ string rpcUrl;
+ }
+
+ // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.
+ mapping(string => Chain) private chains;
+ // Maps from the chain's alias to it's default RPC URL.
+ mapping(string => string) private defaultRpcUrls;
+ // Maps from a chain ID to it's alias.
+ mapping(uint256 => string) private idToAlias;
+
+ bool private fallbackToDefaultRpcUrls = true;
+
+ // The RPC URL will be fetched from config or defaultRpcUrls if possible.
+ function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {
+ require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string.");
+
+ initializeStdChains();
+ chain = chains[chainAlias];
+ require(
+ chain.chainId != 0,
+ string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found."))
+ );
+
+ chain = getChainWithUpdatedRpcUrl(chainAlias, chain);
+ }
+
+ function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {
+ require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0.");
+ initializeStdChains();
+ string memory chainAlias = idToAlias[chainId];
+
+ chain = chains[chainAlias];
+
+ require(
+ chain.chainId != 0,
+ string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found."))
+ );
+
+ chain = getChainWithUpdatedRpcUrl(chainAlias, chain);
+ }
+
+ // set chain info, with priority to argument's rpcUrl field.
+ function setChain(string memory chainAlias, ChainData memory chain) internal virtual {
+ require(
+ bytes(chainAlias).length != 0,
+ "StdChains setChain(string,ChainData): Chain alias cannot be the empty string."
+ );
+
+ require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0.");
+
+ initializeStdChains();
+ string memory foundAlias = idToAlias[chain.chainId];
+
+ require(
+ bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),
+ string(
+ abi.encodePacked(
+ "StdChains setChain(string,ChainData): Chain ID ",
+ vm.toString(chain.chainId),
+ " already used by \"",
+ foundAlias,
+ "\"."
+ )
+ )
+ );
+
+ uint256 oldChainId = chains[chainAlias].chainId;
+ delete idToAlias[oldChainId];
+
+ chains[chainAlias] =
+ Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});
+ idToAlias[chain.chainId] = chainAlias;
+ }
+
+ // set chain info, with priority to argument's rpcUrl field.
+ function setChain(string memory chainAlias, Chain memory chain) internal virtual {
+ setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));
+ }
+
+ function _toUpper(string memory str) private pure returns (string memory) {
+ bytes memory strb = bytes(str);
+ bytes memory copy = new bytes(strb.length);
+ for (uint256 i = 0; i < strb.length; i++) {
+ bytes1 b = strb[i];
+ if (b >= 0x61 && b <= 0x7A) {
+ copy[i] = bytes1(uint8(b) - 32);
+ } else {
+ copy[i] = b;
+ }
+ }
+ return string(copy);
+ }
+
+ // lookup rpcUrl, in descending order of priority:
+ // current -> config (foundry.toml) -> environment variable -> default
+ function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain)
+ private
+ view
+ returns (Chain memory)
+ {
+ if (bytes(chain.rpcUrl).length == 0) {
+ try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {
+ chain.rpcUrl = configRpcUrl;
+ } catch (bytes memory err) {
+ string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL"));
+ if (fallbackToDefaultRpcUrls) {
+ chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);
+ } else {
+ chain.rpcUrl = vm.envString(envName);
+ }
+ // Distinguish 'not found' from 'cannot read'
+ // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions
+ bytes memory oldNotFoundError =
+ abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias)));
+ bytes memory newNotFoundError = abi.encodeWithSignature(
+ "CheatcodeError(string)", string(abi.encodePacked("invalid rpc url: ", chainAlias))
+ );
+ bytes32 errHash = keccak256(err);
+ if (
+ (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError))
+ || bytes(chain.rpcUrl).length == 0
+ ) {
+ assembly ("memory-safe") {
+ revert(add(32, err), mload(err))
+ }
+ }
+ }
+ }
+ return chain;
+ }
+
+ function setFallbackToDefaultRpcUrls(bool useDefault) internal {
+ fallbackToDefaultRpcUrls = useDefault;
+ }
+
+ function initializeStdChains() private {
+ if (stdChainsInitialized) return;
+
+ stdChainsInitialized = true;
+
+ // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`
+ setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545"));
+ setChainWithDefaultRpcUrl("mainnet", ChainData("Mainnet", 1, "https://eth.llamarpc.com"));
+ setChainWithDefaultRpcUrl(
+ "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001")
+ );
+ setChainWithDefaultRpcUrl("holesky", ChainData("Holesky", 17000, "https://rpc.holesky.ethpandaops.io"));
+ setChainWithDefaultRpcUrl("hoodi", ChainData("Hoodi", 560048, "https://rpc.hoodi.ethpandaops.io"));
+ setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io"));
+ setChainWithDefaultRpcUrl(
+ "optimism_sepolia", ChainData("Optimism Sepolia", 11155420, "https://sepolia.optimism.io")
+ );
+ setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc"));
+ setChainWithDefaultRpcUrl(
+ "arbitrum_one_sepolia", ChainData("Arbitrum One Sepolia", 421614, "https://sepolia-rollup.arbitrum.io/rpc")
+ );
+ setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc"));
+ setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com"));
+ setChainWithDefaultRpcUrl(
+ "polygon_amoy", ChainData("Polygon Amoy", 80002, "https://rpc-amoy.polygon.technology")
+ );
+ setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc"));
+ setChainWithDefaultRpcUrl(
+ "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc")
+ );
+ setChainWithDefaultRpcUrl(
+ "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org")
+ );
+ setChainWithDefaultRpcUrl(
+ "bnb_smart_chain_testnet",
+ ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel")
+ );
+ setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com"));
+ setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network"));
+ setChainWithDefaultRpcUrl(
+ "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network")
+ );
+ setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network"));
+ setChainWithDefaultRpcUrl("base_sepolia", ChainData("Base Sepolia", 84532, "https://sepolia.base.org"));
+ setChainWithDefaultRpcUrl("base", ChainData("Base", 8453, "https://mainnet.base.org"));
+ setChainWithDefaultRpcUrl("blast_sepolia", ChainData("Blast Sepolia", 168587773, "https://sepolia.blast.io"));
+ setChainWithDefaultRpcUrl("blast", ChainData("Blast", 81457, "https://rpc.blast.io"));
+ setChainWithDefaultRpcUrl("fantom_opera", ChainData("Fantom Opera", 250, "https://rpc.ankr.com/fantom/"));
+ setChainWithDefaultRpcUrl(
+ "fantom_opera_testnet", ChainData("Fantom Opera Testnet", 4002, "https://rpc.ankr.com/fantom_testnet/")
+ );
+ setChainWithDefaultRpcUrl("fraxtal", ChainData("Fraxtal", 252, "https://rpc.frax.com"));
+ setChainWithDefaultRpcUrl("fraxtal_testnet", ChainData("Fraxtal Testnet", 2522, "https://rpc.testnet.frax.com"));
+ setChainWithDefaultRpcUrl(
+ "berachain_bartio_testnet", ChainData("Berachain bArtio Testnet", 80084, "https://bartio.rpc.berachain.com")
+ );
+ setChainWithDefaultRpcUrl("flare", ChainData("Flare", 14, "https://flare-api.flare.network/ext/C/rpc"));
+ setChainWithDefaultRpcUrl(
+ "flare_coston2", ChainData("Flare Coston2", 114, "https://coston2-api.flare.network/ext/C/rpc")
+ );
+
+ setChainWithDefaultRpcUrl("ink", ChainData("Ink", 57073, "https://rpc-gel.inkonchain.com"));
+ setChainWithDefaultRpcUrl(
+ "ink_sepolia", ChainData("Ink Sepolia", 763373, "https://rpc-gel-sepolia.inkonchain.com")
+ );
+
+ setChainWithDefaultRpcUrl("mode", ChainData("Mode", 34443, "https://mode.drpc.org"));
+ setChainWithDefaultRpcUrl("mode_sepolia", ChainData("Mode Sepolia", 919, "https://sepolia.mode.network"));
+
+ setChainWithDefaultRpcUrl("zora", ChainData("Zora", 7777777, "https://zora.drpc.org"));
+ setChainWithDefaultRpcUrl(
+ "zora_sepolia", ChainData("Zora Sepolia", 999999999, "https://sepolia.rpc.zora.energy")
+ );
+
+ setChainWithDefaultRpcUrl("race", ChainData("Race", 6805, "https://racemainnet.io"));
+ setChainWithDefaultRpcUrl("race_sepolia", ChainData("Race Sepolia", 6806, "https://racemainnet.io"));
+
+ setChainWithDefaultRpcUrl("metal", ChainData("Metal", 1750, "https://metall2.drpc.org"));
+ setChainWithDefaultRpcUrl("metal_sepolia", ChainData("Metal Sepolia", 1740, "https://testnet.rpc.metall2.com"));
+
+ setChainWithDefaultRpcUrl("binary", ChainData("Binary", 624, "https://rpc.zero.thebinaryholdings.com"));
+ setChainWithDefaultRpcUrl(
+ "binary_sepolia", ChainData("Binary Sepolia", 625, "https://rpc.zero.thebinaryholdings.com")
+ );
+
+ setChainWithDefaultRpcUrl("orderly", ChainData("Orderly", 291, "https://rpc.orderly.network"));
+ setChainWithDefaultRpcUrl(
+ "orderly_sepolia", ChainData("Orderly Sepolia", 4460, "https://testnet-rpc.orderly.org")
+ );
+
+ setChainWithDefaultRpcUrl("unichain", ChainData("Unichain", 130, "https://mainnet.unichain.org"));
+ setChainWithDefaultRpcUrl(
+ "unichain_sepolia", ChainData("Unichain Sepolia", 1301, "https://sepolia.unichain.org")
+ );
+ }
+
+ // set chain info, with priority to chainAlias' rpc url in foundry.toml
+ function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {
+ string memory rpcUrl = chain.rpcUrl;
+ defaultRpcUrls[chainAlias] = rpcUrl;
+ chain.rpcUrl = "";
+ setChain(chainAlias, chain);
+ chain.rpcUrl = rpcUrl; // restore argument
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdCheats.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdCheats.sol
new file mode 100644
index 000000000..e5b563fe6
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdCheats.sol
@@ -0,0 +1,825 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {StdStorage, stdStorage} from "./StdStorage.sol";
+import {console2} from "./console2.sol";
+import {Vm} from "./Vm.sol";
+
+abstract contract StdCheatsSafe {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ uint256 private constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ bool private gasMeteringOff;
+
+ // Data structures to parse Transaction objects from the broadcast artifact
+ // that conform to EIP1559. The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct RawTx1559 {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ // json value name = function
+ string functionSig;
+ bytes32 hash;
+ // json value name = tx
+ RawTx1559Detail txDetail;
+ // json value name = type
+ string opcode;
+ }
+
+ struct RawTx1559Detail {
+ AccessList[] accessList;
+ bytes data;
+ address from;
+ bytes gas;
+ bytes nonce;
+ address to;
+ bytes txType;
+ bytes value;
+ }
+
+ struct Tx1559 {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ string functionSig;
+ bytes32 hash;
+ Tx1559Detail txDetail;
+ string opcode;
+ }
+
+ struct Tx1559Detail {
+ AccessList[] accessList;
+ bytes data;
+ address from;
+ uint256 gas;
+ uint256 nonce;
+ address to;
+ uint256 txType;
+ uint256 value;
+ }
+
+ // Data structures to parse Transaction objects from the broadcast artifact
+ // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct TxLegacy {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ string functionSig;
+ string hash;
+ string opcode;
+ TxDetailLegacy transaction;
+ }
+
+ struct TxDetailLegacy {
+ AccessList[] accessList;
+ uint256 chainId;
+ bytes data;
+ address from;
+ uint256 gas;
+ uint256 gasPrice;
+ bytes32 hash;
+ uint256 nonce;
+ bytes1 opcode;
+ bytes32 r;
+ bytes32 s;
+ uint256 txType;
+ address to;
+ uint8 v;
+ uint256 value;
+ }
+
+ struct AccessList {
+ address accessAddress;
+ bytes32[] storageKeys;
+ }
+
+ // Data structures to parse Receipt objects from the broadcast artifact.
+ // The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct RawReceipt {
+ bytes32 blockHash;
+ bytes blockNumber;
+ address contractAddress;
+ bytes cumulativeGasUsed;
+ bytes effectiveGasPrice;
+ address from;
+ bytes gasUsed;
+ RawReceiptLog[] logs;
+ bytes logsBloom;
+ bytes status;
+ address to;
+ bytes32 transactionHash;
+ bytes transactionIndex;
+ }
+
+ struct Receipt {
+ bytes32 blockHash;
+ uint256 blockNumber;
+ address contractAddress;
+ uint256 cumulativeGasUsed;
+ uint256 effectiveGasPrice;
+ address from;
+ uint256 gasUsed;
+ ReceiptLog[] logs;
+ bytes logsBloom;
+ uint256 status;
+ address to;
+ bytes32 transactionHash;
+ uint256 transactionIndex;
+ }
+
+ // Data structures to parse the entire broadcast artifact, assuming the
+ // transactions conform to EIP1559.
+
+ struct EIP1559ScriptArtifact {
+ string[] libraries;
+ string path;
+ string[] pending;
+ Receipt[] receipts;
+ uint256 timestamp;
+ Tx1559[] transactions;
+ TxReturn[] txReturns;
+ }
+
+ struct RawEIP1559ScriptArtifact {
+ string[] libraries;
+ string path;
+ string[] pending;
+ RawReceipt[] receipts;
+ TxReturn[] txReturns;
+ uint256 timestamp;
+ RawTx1559[] transactions;
+ }
+
+ struct RawReceiptLog {
+ // json value = address
+ address logAddress;
+ bytes32 blockHash;
+ bytes blockNumber;
+ bytes data;
+ bytes logIndex;
+ bool removed;
+ bytes32[] topics;
+ bytes32 transactionHash;
+ bytes transactionIndex;
+ bytes transactionLogIndex;
+ }
+
+ struct ReceiptLog {
+ // json value = address
+ address logAddress;
+ bytes32 blockHash;
+ uint256 blockNumber;
+ bytes data;
+ uint256 logIndex;
+ bytes32[] topics;
+ uint256 transactionIndex;
+ uint256 transactionLogIndex;
+ bool removed;
+ }
+
+ struct TxReturn {
+ string internalType;
+ string value;
+ }
+
+ struct Account {
+ address addr;
+ uint256 key;
+ }
+
+ enum AddressType {
+ Payable,
+ NonPayable,
+ ZeroAddress,
+ Precompile,
+ ForgeAddress
+ }
+
+ // Checks that `addr` is not blacklisted by token contracts that have a blacklist.
+ function assumeNotBlacklisted(address token, address addr) internal view virtual {
+ // Nothing to check if `token` is not a contract.
+ uint256 tokenCodeSize;
+ assembly {
+ tokenCodeSize := extcodesize(token)
+ }
+ require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.");
+
+ bool success;
+ bytes memory returnData;
+
+ // 4-byte selector for `isBlacklisted(address)`, used by USDC.
+ (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));
+ vm.assume(!success || abi.decode(returnData, (bool)) == false);
+
+ // 4-byte selector for `isBlackListed(address)`, used by USDT.
+ (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));
+ vm.assume(!success || abi.decode(returnData, (bool)) == false);
+ }
+
+ // Checks that `addr` is not blacklisted by token contracts that have a blacklist.
+ // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for
+ // backwards compatibility, since this name was used in the original PR which already has
+ // a release. This function can be removed in a future release once we want a breaking change.
+ function assumeNoBlacklisted(address token, address addr) internal view virtual {
+ assumeNotBlacklisted(token, addr);
+ }
+
+ function assumeAddressIsNot(address addr, AddressType addressType) internal virtual {
+ if (addressType == AddressType.Payable) {
+ assumeNotPayable(addr);
+ } else if (addressType == AddressType.NonPayable) {
+ assumePayable(addr);
+ } else if (addressType == AddressType.ZeroAddress) {
+ assumeNotZeroAddress(addr);
+ } else if (addressType == AddressType.Precompile) {
+ assumeNotPrecompile(addr);
+ } else if (addressType == AddressType.ForgeAddress) {
+ assumeNotForgeAddress(addr);
+ }
+ }
+
+ function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ }
+
+ function assumeAddressIsNot(
+ address addr,
+ AddressType addressType1,
+ AddressType addressType2,
+ AddressType addressType3
+ ) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ assumeAddressIsNot(addr, addressType3);
+ }
+
+ function assumeAddressIsNot(
+ address addr,
+ AddressType addressType1,
+ AddressType addressType2,
+ AddressType addressType3,
+ AddressType addressType4
+ ) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ assumeAddressIsNot(addr, addressType3);
+ assumeAddressIsNot(addr, addressType4);
+ }
+
+ // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to
+ // `addr` and checking the `success` return value.
+ // NOTE: This function may result in state changes depending on the fallback/receive logic
+ // implemented by `addr`, which should be taken into account when this function is used.
+ function _isPayable(address addr) private returns (bool) {
+ require(
+ addr.balance < UINT256_MAX,
+ "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds"
+ );
+ uint256 origBalanceTest = address(this).balance;
+ uint256 origBalanceAddr = address(addr).balance;
+
+ vm.deal(address(this), 1);
+ (bool success,) = payable(addr).call{value: 1}("");
+
+ // reset balances
+ vm.deal(address(this), origBalanceTest);
+ vm.deal(addr, origBalanceAddr);
+
+ return success;
+ }
+
+ // NOTE: This function may result in state changes depending on the fallback/receive logic
+ // implemented by `addr`, which should be taken into account when this function is used. See the
+ // `_isPayable` method for more information.
+ function assumePayable(address addr) internal virtual {
+ vm.assume(_isPayable(addr));
+ }
+
+ function assumeNotPayable(address addr) internal virtual {
+ vm.assume(!_isPayable(addr));
+ }
+
+ function assumeNotZeroAddress(address addr) internal pure virtual {
+ vm.assume(addr != address(0));
+ }
+
+ function assumeNotPrecompile(address addr) internal pure virtual {
+ assumeNotPrecompile(addr, _pureChainId());
+ }
+
+ function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual {
+ // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific
+ // address), but the same rationale for excluding them applies so we include those too.
+
+ // These are reserved by Ethereum and may be on all EVM-compatible chains.
+ vm.assume(addr < address(0x1) || addr > address(0xff));
+
+ // forgefmt: disable-start
+ if (chainId == 10 || chainId == 420 || chainId == 11155420) {
+ // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21
+ vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));
+ } else if (chainId == 42161 || chainId == 421613) {
+ // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains
+ vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));
+ } else if (chainId == 43114 || chainId == 43113) {
+ // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59
+ vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));
+ vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));
+ vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));
+ }
+ // forgefmt: disable-end
+ }
+
+ function assumeNotForgeAddress(address addr) internal pure virtual {
+ // vm, console, and Create2Deployer addresses
+ vm.assume(
+ addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67
+ && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C
+ );
+ }
+
+ function assumeUnusedAddress(address addr) internal view virtual {
+ uint256 size;
+ assembly {
+ size := extcodesize(addr)
+ }
+ vm.assume(size == 0);
+
+ assumeNotPrecompile(addr);
+ assumeNotZeroAddress(addr);
+ assumeNotForgeAddress(addr);
+ }
+
+ function readEIP1559ScriptArtifact(string memory path)
+ internal
+ view
+ virtual
+ returns (EIP1559ScriptArtifact memory)
+ {
+ string memory data = vm.readFile(path);
+ bytes memory parsedData = vm.parseJson(data);
+ RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));
+ EIP1559ScriptArtifact memory artifact;
+ artifact.libraries = rawArtifact.libraries;
+ artifact.path = rawArtifact.path;
+ artifact.timestamp = rawArtifact.timestamp;
+ artifact.pending = rawArtifact.pending;
+ artifact.txReturns = rawArtifact.txReturns;
+ artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);
+ artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);
+ return artifact;
+ }
+
+ function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {
+ Tx1559[] memory txs = new Tx1559[](rawTxs.length);
+ for (uint256 i; i < rawTxs.length; i++) {
+ txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);
+ }
+ return txs;
+ }
+
+ function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {
+ Tx1559 memory transaction;
+ transaction.arguments = rawTx.arguments;
+ transaction.contractAddress = rawTx.contractAddress;
+ transaction.contractName = rawTx.contractName;
+ transaction.functionSig = rawTx.functionSig;
+ transaction.hash = rawTx.hash;
+ transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);
+ transaction.opcode = rawTx.opcode;
+ return transaction;
+ }
+
+ function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)
+ internal
+ pure
+ virtual
+ returns (Tx1559Detail memory)
+ {
+ Tx1559Detail memory txDetail;
+ txDetail.data = rawDetail.data;
+ txDetail.from = rawDetail.from;
+ txDetail.to = rawDetail.to;
+ txDetail.nonce = _bytesToUint(rawDetail.nonce);
+ txDetail.txType = _bytesToUint(rawDetail.txType);
+ txDetail.value = _bytesToUint(rawDetail.value);
+ txDetail.gas = _bytesToUint(rawDetail.gas);
+ txDetail.accessList = rawDetail.accessList;
+ return txDetail;
+ }
+
+ function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {
+ string memory deployData = vm.readFile(path);
+ bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions");
+ RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));
+ return rawToConvertedEIPTx1559s(rawTxs);
+ }
+
+ function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {
+ string memory deployData = vm.readFile(path);
+ string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]"));
+ bytes memory parsedDeployData = vm.parseJson(deployData, key);
+ RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));
+ return rawToConvertedEIPTx1559(rawTx);
+ }
+
+ // Analogous to readTransactions, but for receipts.
+ function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {
+ string memory deployData = vm.readFile(path);
+ bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts");
+ RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));
+ return rawToConvertedReceipts(rawReceipts);
+ }
+
+ function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {
+ string memory deployData = vm.readFile(path);
+ string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]"));
+ bytes memory parsedDeployData = vm.parseJson(deployData, key);
+ RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));
+ return rawToConvertedReceipt(rawReceipt);
+ }
+
+ function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {
+ Receipt[] memory receipts = new Receipt[](rawReceipts.length);
+ for (uint256 i; i < rawReceipts.length; i++) {
+ receipts[i] = rawToConvertedReceipt(rawReceipts[i]);
+ }
+ return receipts;
+ }
+
+ function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {
+ Receipt memory receipt;
+ receipt.blockHash = rawReceipt.blockHash;
+ receipt.to = rawReceipt.to;
+ receipt.from = rawReceipt.from;
+ receipt.contractAddress = rawReceipt.contractAddress;
+ receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);
+ receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);
+ receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);
+ receipt.status = _bytesToUint(rawReceipt.status);
+ receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);
+ receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);
+ receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);
+ receipt.logsBloom = rawReceipt.logsBloom;
+ receipt.transactionHash = rawReceipt.transactionHash;
+ return receipt;
+ }
+
+ function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)
+ internal
+ pure
+ virtual
+ returns (ReceiptLog[] memory)
+ {
+ ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);
+ for (uint256 i; i < rawLogs.length; i++) {
+ logs[i].logAddress = rawLogs[i].logAddress;
+ logs[i].blockHash = rawLogs[i].blockHash;
+ logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);
+ logs[i].data = rawLogs[i].data;
+ logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);
+ logs[i].topics = rawLogs[i].topics;
+ logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);
+ logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);
+ logs[i].removed = rawLogs[i].removed;
+ }
+ return logs;
+ }
+
+ // Deploy a contract by fetching the contract bytecode from
+ // the artifacts directory
+ // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`
+ function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {
+ bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);
+ assembly ("memory-safe") {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed.");
+ }
+
+ function deployCode(string memory what) internal virtual returns (address addr) {
+ bytes memory bytecode = vm.getCode(what);
+ assembly ("memory-safe") {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string): Deployment failed.");
+ }
+
+ /// @dev deploy contract with value on construction
+ function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {
+ bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);
+ assembly ("memory-safe") {
+ addr := create(val, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed.");
+ }
+
+ function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {
+ bytes memory bytecode = vm.getCode(what);
+ assembly ("memory-safe") {
+ addr := create(val, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed.");
+ }
+
+ // creates a labeled address and the corresponding private key
+ function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {
+ privateKey = uint256(keccak256(abi.encodePacked(name)));
+ addr = vm.addr(privateKey);
+ vm.label(addr, name);
+ }
+
+ // creates a labeled address
+ function makeAddr(string memory name) internal virtual returns (address addr) {
+ (addr,) = makeAddrAndKey(name);
+ }
+
+ // Destroys an account immediately, sending the balance to beneficiary.
+ // Destroying means: balance will be zero, code will be empty, and nonce will be 0
+ // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce
+ // only after tx ends, this will run immediately.
+ function destroyAccount(address who, address beneficiary) internal virtual {
+ uint256 currBalance = who.balance;
+ vm.etch(who, abi.encode());
+ vm.deal(who, 0);
+ vm.resetNonce(who);
+
+ uint256 beneficiaryBalance = beneficiary.balance;
+ vm.deal(beneficiary, currBalance + beneficiaryBalance);
+ }
+
+ // creates a struct containing both a labeled address and the corresponding private key
+ function makeAccount(string memory name) internal virtual returns (Account memory account) {
+ (account.addr, account.key) = makeAddrAndKey(name);
+ }
+
+ function deriveRememberKey(string memory mnemonic, uint32 index)
+ internal
+ virtual
+ returns (address who, uint256 privateKey)
+ {
+ privateKey = vm.deriveKey(mnemonic, index);
+ who = vm.rememberKey(privateKey);
+ }
+
+ function _bytesToUint(bytes memory b) private pure returns (uint256) {
+ require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32.");
+ return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));
+ }
+
+ function isFork() internal view virtual returns (bool status) {
+ try vm.activeFork() {
+ status = true;
+ } catch (bytes memory) {}
+ }
+
+ modifier skipWhenForking() {
+ if (!isFork()) {
+ _;
+ }
+ }
+
+ modifier skipWhenNotForking() {
+ if (isFork()) {
+ _;
+ }
+ }
+
+ modifier noGasMetering() {
+ vm.pauseGasMetering();
+ // To prevent turning gas monitoring back on with nested functions that use this modifier,
+ // we check if gasMetering started in the off position. If it did, we don't want to turn
+ // it back on until we exit the top level function that used the modifier
+ //
+ // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.
+ // funcA will have `gasStartedOff` as false, funcB will have it as true,
+ // so we only turn metering back on at the end of the funcA
+ bool gasStartedOff = gasMeteringOff;
+ gasMeteringOff = true;
+
+ _;
+
+ // if gas metering was on when this modifier was called, turn it back on at the end
+ if (!gasStartedOff) {
+ gasMeteringOff = false;
+ vm.resumeGasMetering();
+ }
+ }
+
+ // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no
+ // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We
+ // can't simply access the chain ID in a normal view or pure function because the solc View Pure
+ // Checker changed `chainid` from pure to view in 0.8.0.
+ function _viewChainId() private view returns (uint256 chainId) {
+ // Assembly required since `block.chainid` was introduced in 0.8.0.
+ assembly {
+ chainId := chainid()
+ }
+
+ address(this); // Silence warnings in older Solc versions.
+ }
+
+ function _pureChainId() private pure returns (uint256 chainId) {
+ function() internal view returns (uint256) fnIn = _viewChainId;
+ function() internal pure returns (uint256) pureChainId;
+ assembly {
+ pureChainId := fnIn
+ }
+ chainId = pureChainId();
+ }
+}
+
+// Wrappers around cheatcodes to avoid footguns
+abstract contract StdCheats is StdCheatsSafe {
+ using stdStorage for StdStorage;
+
+ StdStorage private stdstore;
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+ address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
+
+ // Skip forward or rewind time by the specified number of seconds
+ function skip(uint256 time) internal virtual {
+ vm.warp(vm.getBlockTimestamp() + time);
+ }
+
+ function rewind(uint256 time) internal virtual {
+ vm.warp(vm.getBlockTimestamp() - time);
+ }
+
+ // Setup a prank from an address that has some ether
+ function hoax(address msgSender) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.prank(msgSender);
+ }
+
+ function hoax(address msgSender, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.prank(msgSender);
+ }
+
+ function hoax(address msgSender, address origin) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.prank(msgSender, origin);
+ }
+
+ function hoax(address msgSender, address origin, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.prank(msgSender, origin);
+ }
+
+ // Start perpetual prank from an address that has some ether
+ function startHoax(address msgSender) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.startPrank(msgSender);
+ }
+
+ function startHoax(address msgSender, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.startPrank(msgSender);
+ }
+
+ // Start perpetual prank from an address that has some ether
+ // tx.origin is set to the origin parameter
+ function startHoax(address msgSender, address origin) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.startPrank(msgSender, origin);
+ }
+
+ function startHoax(address msgSender, address origin, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.startPrank(msgSender, origin);
+ }
+
+ function changePrank(address msgSender) internal virtual {
+ console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead.");
+ vm.stopPrank();
+ vm.startPrank(msgSender);
+ }
+
+ function changePrank(address msgSender, address txOrigin) internal virtual {
+ console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead.");
+ vm.stopPrank();
+ vm.startPrank(msgSender, txOrigin);
+ }
+
+ // The same as Vm's `deal`
+ // Use the alternative signature for ERC20 tokens
+ function deal(address to, uint256 give) internal virtual {
+ vm.deal(to, give);
+ }
+
+ // Set the balance of an account for any ERC20 token
+ // Use the alternative signature to update `totalSupply`
+ function deal(address token, address to, uint256 give) internal virtual {
+ deal(token, to, give, false);
+ }
+
+ // Set the balance of an account for any ERC1155 token
+ // Use the alternative signature to update `totalSupply`
+ function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {
+ dealERC1155(token, to, id, give, false);
+ }
+
+ function deal(address token, address to, uint256 give, bool adjust) internal virtual {
+ // get current balance
+ (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));
+ uint256 prevBal = abi.decode(balData, (uint256));
+
+ // update balance
+ stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);
+
+ // update total supply
+ if (adjust) {
+ (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));
+ uint256 totSup = abi.decode(totSupData, (uint256));
+ if (give < prevBal) {
+ totSup -= (prevBal - give);
+ } else {
+ totSup += (give - prevBal);
+ }
+ stdstore.target(token).sig(0x18160ddd).checked_write(totSup);
+ }
+ }
+
+ function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {
+ // get current balance
+ (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));
+ uint256 prevBal = abi.decode(balData, (uint256));
+
+ // update balance
+ stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);
+
+ // update total supply
+ if (adjust) {
+ (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));
+ require(
+ totSupData.length != 0,
+ "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply."
+ );
+ uint256 totSup = abi.decode(totSupData, (uint256));
+ if (give < prevBal) {
+ totSup -= (prevBal - give);
+ } else {
+ totSup += (give - prevBal);
+ }
+ stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);
+ }
+ }
+
+ function dealERC721(address token, address to, uint256 id) internal virtual {
+ // check if token id is already minted and the actual owner.
+ (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));
+ require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted.");
+
+ // get owner current balance
+ (, bytes memory fromBalData) =
+ token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));
+ uint256 fromPrevBal = abi.decode(fromBalData, (uint256));
+
+ // get new user current balance
+ (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));
+ uint256 toPrevBal = abi.decode(toBalData, (uint256));
+
+ // update balances
+ stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);
+ stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);
+
+ // update owner
+ stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);
+ }
+
+ function deployCodeTo(string memory what, address where) internal virtual {
+ deployCodeTo(what, "", 0, where);
+ }
+
+ function deployCodeTo(string memory what, bytes memory args, address where) internal virtual {
+ deployCodeTo(what, args, 0, where);
+ }
+
+ function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual {
+ bytes memory creationCode = vm.getCode(what);
+ vm.etch(where, abi.encodePacked(creationCode, args));
+ (bool success, bytes memory runtimeBytecode) = where.call{value: value}("");
+ require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.");
+ vm.etch(where, runtimeBytecode);
+ }
+
+ // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.
+ function console2_log_StdCheats(string memory p0) private view {
+ (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0));
+ status;
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdConfig.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdConfig.sol
new file mode 100644
index 000000000..9eeeea914
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdConfig.sol
@@ -0,0 +1,632 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity ^0.8.13;
+
+import {VmSafe} from "./Vm.sol";
+import {Variable, Type, TypeKind, LibVariable} from "./LibVariable.sol";
+
+/// @notice A contract that parses a toml configuration file and load its
+/// variables into storage, automatically casting them, on deployment.
+///
+/// @dev This contract assumes a toml structure where top-level keys
+/// represent chain ids or aliases. Under each chain key, variables are
+/// organized by type in separate sub-tables like `[.]`, where
+/// type must be: `bool`, `address`, `bytes32`, `uint`, `ìnt`, `string`, or `bytes`.
+///
+/// Supported format:
+/// ```
+/// [mainnet]
+/// endpoint_url = "${MAINNET_RPC}"
+///
+/// [mainnet.bool]
+/// is_live = true
+///
+/// [mainnet.address]
+/// weth = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
+/// whitelisted_admins = [
+/// "${MAINNET_ADMIN}",
+/// "0x00000000000000000000000000000000deadbeef",
+/// "0x000000000000000000000000000000c0ffeebabe"
+/// ]
+///
+/// [mainnet.uint]
+/// important_number = 123
+/// ```
+contract StdConfig {
+ using LibVariable for Type;
+ using LibVariable for TypeKind;
+
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ /// @dev Types: `bool`, `address`, `bytes32`, `uint`, `ìnt`, `string`, `bytes`.
+ uint8 private constant NUM_TYPES = 7;
+
+ // -- ERRORS ---------------------------------------------------------------
+
+ error AlreadyInitialized(string key);
+ error InvalidChainKey(string aliasOrId);
+ error ChainNotInitialized(uint256 chainId);
+ error UnableToParseVariable(string key);
+ error WriteToFileInForbiddenCtxt();
+
+ // -- STORAGE (CACHE FROM CONFIG FILE) ------------------------------------
+
+ /// @dev Path to the loaded TOML configuration file.
+ string private _filePath;
+
+ /// @dev List of top-level keys found in the TOML file, assumed to be chain names/aliases.
+ string[] private _chainKeys;
+
+ /// @dev Storage for the configured RPC URL for each chain.
+ mapping(uint256 => string) private _rpcOf;
+
+ /// @dev Storage for values, organized by chain ID and variable key.
+ mapping(uint256 => mapping(string => bytes)) private _dataOf;
+
+ /// @dev Type cache for runtime checking when casting.
+ mapping(uint256 => mapping(string => Type)) private _typeOf;
+
+ /// @dev When enabled, `set` will always write updates back to the configuration file.
+ /// Can only be enabled in a scripting context to prevent file corruption from
+ /// concurrent I/O access, as tests run in parallel.
+ bool private _writeToFile;
+
+ // -- CONSTRUCTOR ----------------------------------------------------------
+
+ /// @notice Reads the TOML file and iterates through each top-level key, which is
+ /// assumed to be a chain name or ID. For each chain, it caches its RPC
+ /// endpoint and all variables defined in typed sub-tables like `[.]`,
+ /// where type must be: `bool`, `address`, `uint`, `bytes32`, `string`, or `bytes`.
+ ///
+ /// The constructor attempts to parse each variable first as a single value,
+ /// and if that fails, as an array of that type. If a variable cannot be
+ /// parsed as either, the constructor will revert with an error.
+ ///
+ /// @param configFilePath: The local path to the TOML configuration file.
+ /// @param writeToFile: Whether to write updates back to the TOML file. Only for scripts.
+ constructor(string memory configFilePath, bool writeToFile) {
+ if (writeToFile && !vm.isContext(VmSafe.ForgeContext.ScriptGroup)) {
+ revert WriteToFileInForbiddenCtxt();
+ }
+
+ _filePath = configFilePath;
+ _writeToFile = writeToFile;
+ string memory content = vm.resolveEnv(vm.readFile(configFilePath));
+ string[] memory chain_keys = vm.parseTomlKeys(content, "$");
+
+ // Cache the entire configuration to storage
+ for (uint256 i = 0; i < chain_keys.length; i++) {
+ string memory chain_key = chain_keys[i];
+ // Ignore top-level keys that are not tables
+ if (vm.parseTomlKeys(content, string.concat("$.", chain_key)).length == 0) {
+ continue;
+ }
+ uint256 chainId = resolveChainId(chain_key);
+ _chainKeys.push(chain_key);
+
+ // Cache the configure rpc endpoint for that chain.
+ // Falls back to `[rpc_endpoints]`. Panics if no rpc endpoint is configured.
+ try vm.parseTomlString(content, string.concat("$.", chain_key, ".endpoint_url")) returns (
+ string memory url
+ ) {
+ _rpcOf[chainId] = vm.resolveEnv(url);
+ } catch {
+ _rpcOf[chainId] = vm.resolveEnv(vm.rpcUrl(chain_key));
+ }
+
+ // Iterate through all the available `TypeKind`s (except `None`) to create the sub-section paths
+ for (uint8 t = 1; t <= NUM_TYPES; t++) {
+ TypeKind ty = TypeKind(t);
+ string memory typePath = string.concat("$.", chain_key, ".", ty.toTomlKey());
+
+ try vm.parseTomlKeys(content, typePath) returns (string[] memory keys) {
+ for (uint256 j = 0; j < keys.length; j++) {
+ string memory key = keys[j];
+ if (_typeOf[chainId][key].kind == TypeKind.None) {
+ _loadAndCacheValue(content, string.concat(typePath, ".", key), chainId, key, ty);
+ } else {
+ revert AlreadyInitialized(key);
+ }
+ }
+ } catch {}
+ }
+ }
+ }
+
+ function _loadAndCacheValue(
+ string memory content,
+ string memory path,
+ uint256 chainId,
+ string memory key,
+ TypeKind ty
+ ) private {
+ bool success = false;
+ if (ty == TypeKind.Bool) {
+ try vm.parseTomlBool(content, path) returns (bool val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bool, false);
+ success = true;
+ } catch {
+ try vm.parseTomlBoolArray(content, path) returns (bool[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bool, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Address) {
+ try vm.parseTomlAddress(content, path) returns (address val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Address, false);
+ success = true;
+ } catch {
+ try vm.parseTomlAddressArray(content, path) returns (address[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Address, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Bytes32) {
+ try vm.parseTomlBytes32(content, path) returns (bytes32 val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bytes32, false);
+ success = true;
+ } catch {
+ try vm.parseTomlBytes32Array(content, path) returns (bytes32[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bytes32, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Uint256) {
+ try vm.parseTomlUint(content, path) returns (uint256 val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Uint256, false);
+ success = true;
+ } catch {
+ try vm.parseTomlUintArray(content, path) returns (uint256[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Uint256, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Int256) {
+ try vm.parseTomlInt(content, path) returns (int256 val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Int256, false);
+ success = true;
+ } catch {
+ try vm.parseTomlIntArray(content, path) returns (int256[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Int256, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Bytes) {
+ try vm.parseTomlBytes(content, path) returns (bytes memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bytes, false);
+ success = true;
+ } catch {
+ try vm.parseTomlBytesArray(content, path) returns (bytes[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bytes, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.String) {
+ try vm.parseTomlString(content, path) returns (string memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.String, false);
+ success = true;
+ } catch {
+ try vm.parseTomlStringArray(content, path) returns (string[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.String, true);
+ success = true;
+ } catch {}
+ }
+ }
+
+ if (!success) {
+ revert UnableToParseVariable(key);
+ }
+ }
+
+ // -- HELPER FUNCTIONS -----------------------------------------------------
+
+ /// @notice Enable or disable automatic writing to the TOML file on `set`.
+ /// Can only be enabled when scripting.
+ function writeUpdatesBackToFile(bool enabled) public {
+ if (enabled && !vm.isContext(VmSafe.ForgeContext.ScriptGroup)) {
+ revert WriteToFileInForbiddenCtxt();
+ }
+
+ _writeToFile = enabled;
+ }
+
+ /// @notice Resolves a chain alias or a chain id string to its numerical chain id.
+ /// @param aliasOrId The string representing the chain alias (i.e. "mainnet") or a numerical ID (i.e. "1").
+ /// @return The numerical chain ID.
+ /// @dev It first attempts to parse the input as a number. If that fails, it uses `vm.getChain` to resolve a named alias.
+ /// Reverts if the alias is not valid or not a number.
+ function resolveChainId(string memory aliasOrId) public view returns (uint256) {
+ try vm.parseUint(aliasOrId) returns (uint256 chainId) {
+ return chainId;
+ } catch {
+ try vm.getChain(aliasOrId) returns (VmSafe.Chain memory chainInfo) {
+ return chainInfo.chainId;
+ } catch {
+ revert InvalidChainKey(aliasOrId);
+ }
+ }
+ }
+
+ /// @dev Retrieves the chain key/alias from the configuration based on the chain ID.
+ function _getChainKeyFromId(uint256 chainId) private view returns (string memory) {
+ for (uint256 i = 0; i < _chainKeys.length; i++) {
+ if (resolveChainId(_chainKeys[i]) == chainId) {
+ return _chainKeys[i];
+ }
+ }
+ revert ChainNotInitialized(chainId);
+ }
+
+ /// @dev Ensures type consistency when setting a value - prevents changing types unless uninitialized.
+ /// Updates type only when the previous type was `None`.
+ function _ensureTypeConsistency(uint256 chainId, string memory key, Type memory ty) private {
+ Type memory current = _typeOf[chainId][key];
+
+ if (current.kind == TypeKind.None) {
+ _typeOf[chainId][key] = ty;
+ } else {
+ current.assertEq(ty);
+ }
+ }
+
+ /// @dev Wraps a string in double quotes for JSON compatibility.
+ function _quote(string memory s) private pure returns (string memory) {
+ return string.concat('"', s, '"');
+ }
+
+ /// @dev Writes a JSON-formatted value to a specific key in the TOML file.
+ /// @param chainId The chain id to write under.
+ /// @param ty The type category ('bool', 'address', 'uint', 'bytes32', 'string', or 'bytes').
+ /// @param key The variable key name.
+ /// @param jsonValue The JSON-formatted value to write.
+ function _writeToToml(uint256 chainId, string memory ty, string memory key, string memory jsonValue) private {
+ string memory chainKey = _getChainKeyFromId(chainId);
+ string memory valueKey = string.concat("$.", chainKey, ".", ty, ".", key);
+ vm.writeToml(jsonValue, _filePath, valueKey);
+ }
+
+ // -- GETTER FUNCTIONS -----------------------------------------------------
+
+ /// @dev Reads a variable for a given chain id and key, and returns it in a generic container.
+ /// The caller should use `LibVariable` to safely coerce the type.
+ /// Example: `uint256 myVar = config.get("my_key").toUint256();`
+ ///
+ /// @param chain_id The chain ID to read from.
+ /// @param key The key of the variable to retrieve.
+ /// @return `Variable` struct containing the type and the ABI-encoded value.
+ function get(uint256 chain_id, string memory key) public view returns (Variable memory) {
+ return Variable(_typeOf[chain_id][key], _dataOf[chain_id][key]);
+ }
+
+ /// @dev Reads a variable for the current chain and a given key, and returns it in a generic container.
+ /// The caller should use `LibVariable` to safely coerce the type.
+ /// Example: `uint256 myVar = config.get("my_key").toUint256();`
+ ///
+ /// @param key The key of the variable to retrieve.
+ /// @return `Variable` struct containing the type and the ABI-encoded value.
+ function get(string memory key) public view returns (Variable memory) {
+ return get(vm.getChainId(), key);
+ }
+
+ /// @dev Checks the existence of a variable for a given chain ID and key, and returns a boolean.
+ /// Example: `bool hasKey = config.exists(1, "my_key");`
+ ///
+ /// @param chain_id The chain ID to check.
+ /// @param key The variable key name.
+ /// @return `bool` indicating whether a variable with the given key exists.
+ function exists(uint256 chain_id, string memory key) public view returns (bool) {
+ return _dataOf[chain_id][key].length > 0;
+ }
+
+ /// @dev Checks the existence of a variable for the current chain id and a given key, and returns a boolean.
+ /// Example: `bool hasKey = config.exists("my_key");`
+ ///
+ /// @param key The variable key name.
+ /// @return `bool` indicating whether a variable with the given key exists.
+ function exists(string memory key) public view returns (bool) {
+ return exists(vm.getChainId(), key);
+ }
+
+ /// @notice Returns the numerical chain ids for all configured chains.
+ function getChainIds() public view returns (uint256[] memory) {
+ string[] memory keys = _chainKeys;
+
+ uint256[] memory ids = new uint256[](keys.length);
+ for (uint256 i = 0; i < keys.length; i++) {
+ ids[i] = resolveChainId(keys[i]);
+ }
+
+ return ids;
+ }
+
+ /// @notice Reads the RPC URL for a specific chain id.
+ function getRpcUrl(uint256 chainId) public view returns (string memory) {
+ return _rpcOf[chainId];
+ }
+
+ /// @notice Reads the RPC URL for the current chain.
+ function getRpcUrl() public view returns (string memory) {
+ return _rpcOf[vm.getChainId()];
+ }
+
+ // -- SETTER FUNCTIONS (SINGLE VALUES) -------------------------------------
+
+ /// @notice Sets a boolean value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bool value) public {
+ Type memory ty = Type(TypeKind.Bool, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value));
+ }
+
+ /// @notice Sets a boolean value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bool value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets an address value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, address value) public {
+ Type memory ty = Type(TypeKind.Address, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value)));
+ }
+
+ /// @notice Sets an address value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, address value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a bytes32 value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bytes32 value) public {
+ Type memory ty = Type(TypeKind.Bytes32, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value)));
+ }
+
+ /// @notice Sets a bytes32 value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bytes32 value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a uint256 value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, uint256 value) public {
+ Type memory ty = Type(TypeKind.Uint256, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value));
+ }
+
+ /// @notice Sets a uint256 value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, uint256 value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets an int256 value for a given key and chain ID.
+ function set(uint256 chainId, string memory key, int256 value) public {
+ Type memory ty = Type(TypeKind.Int256, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value));
+ }
+
+ /// @notice Sets an int256 value for a given key on the current chain.
+ function set(string memory key, int256 value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a string value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, string memory value) public {
+ Type memory ty = Type(TypeKind.String, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(value));
+ }
+
+ /// @notice Sets a string value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, string memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a bytes value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bytes memory value) public {
+ Type memory ty = Type(TypeKind.Bytes, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value)));
+ }
+
+ /// @notice Sets a bytes value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bytes memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ // -- SETTER FUNCTIONS (ARRAYS) --------------------------------------------
+
+ /// @notice Sets a boolean array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bool[] memory value) public {
+ Type memory ty = Type(TypeKind.Bool, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, vm.toString(value[i]));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a boolean array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bool[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets an address array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, address[] memory value) public {
+ Type memory ty = Type(TypeKind.Address, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, _quote(vm.toString(value[i])));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets an address array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, address[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a bytes32 array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bytes32[] memory value) public {
+ Type memory ty = Type(TypeKind.Bytes32, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, _quote(vm.toString(value[i])));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a bytes32 array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bytes32[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a uint256 array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, uint256[] memory value) public {
+ Type memory ty = Type(TypeKind.Uint256, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, vm.toString(value[i]));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a uint256 array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, uint256[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a int256 array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, int256[] memory value) public {
+ Type memory ty = Type(TypeKind.Int256, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, vm.toString(value[i]));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a int256 array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, int256[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a string array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, string[] memory value) public {
+ Type memory ty = Type(TypeKind.String, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, _quote(value[i]));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a string array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, string[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a bytes array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bytes[] memory value) public {
+ Type memory ty = Type(TypeKind.Bytes, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, _quote(vm.toString(value[i])));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a bytes array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bytes[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdConstants.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdConstants.sol
new file mode 100644
index 000000000..9f069ef8c
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdConstants.sol
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {IMulticall3} from "./interfaces/IMulticall3.sol";
+import {Vm} from "./Vm.sol";
+
+library StdConstants {
+ /// @dev Cheat code address.
+ /// Calculated as `address(uint160(uint256(keccak256("hevm cheat code"))))`.
+ Vm internal constant VM = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+ /// @dev console.sol and console2.sol work by executing a staticcall to this address.
+ /// Calculated as `address(uint160(uint88(bytes11("console.log"))))`.
+ address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;
+ /// @dev Used when deploying with create2.
+ /// Taken from https://github.com/Arachnid/deterministic-deployment-proxy.
+ address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+ /// @dev The default address for tx.origin and msg.sender.
+ /// Calculated as `address(uint160(uint256(keccak256("foundry default caller"))))`.
+ address internal constant DEFAULT_SENDER = 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38;
+ /// @dev The address of the first contract `CREATE`d by a running test contract.
+ /// When running tests, each test contract is `CREATE`d by `DEFAULT_SENDER` with nonce 1.
+ /// Calculated as `VM.computeCreateAddress(VM.computeCreateAddress(DEFAULT_SENDER, 1), 1)`.
+ address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;
+ /// @dev Deterministic deployment address of the Multicall3 contract.
+ /// Taken from https://www.multicall3.com.
+ IMulticall3 internal constant MULTICALL3_ADDRESS = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);
+ /// @dev The order of the secp256k1 curve.
+ uint256 internal constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdError.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdError.sol
new file mode 100644
index 000000000..24490087c
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdError.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test
+pragma solidity >=0.8.13 <0.9.0;
+
+library stdError {
+ bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01);
+ bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11);
+ bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12);
+ bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21);
+ bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22);
+ bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31);
+ bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32);
+ bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41);
+ bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdInvariant.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdInvariant.sol
new file mode 100644
index 000000000..87ea87b34
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdInvariant.sol
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+abstract contract StdInvariant {
+ struct FuzzSelector {
+ address addr;
+ bytes4[] selectors;
+ }
+
+ struct FuzzArtifactSelector {
+ string artifact;
+ bytes4[] selectors;
+ }
+
+ struct FuzzInterface {
+ address addr;
+ string[] artifacts;
+ }
+
+ address[] private _excludedContracts;
+ address[] private _excludedSenders;
+ address[] private _targetedContracts;
+ address[] private _targetedSenders;
+
+ string[] private _excludedArtifacts;
+ string[] private _targetedArtifacts;
+
+ FuzzArtifactSelector[] private _targetedArtifactSelectors;
+
+ FuzzSelector[] private _excludedSelectors;
+ FuzzSelector[] private _targetedSelectors;
+
+ FuzzInterface[] private _targetedInterfaces;
+
+ // Functions for users:
+ // These are intended to be called in tests.
+
+ function excludeContract(address newExcludedContract_) internal {
+ _excludedContracts.push(newExcludedContract_);
+ }
+
+ function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {
+ _excludedSelectors.push(newExcludedSelector_);
+ }
+
+ function excludeSender(address newExcludedSender_) internal {
+ _excludedSenders.push(newExcludedSender_);
+ }
+
+ function excludeArtifact(string memory newExcludedArtifact_) internal {
+ _excludedArtifacts.push(newExcludedArtifact_);
+ }
+
+ function targetArtifact(string memory newTargetedArtifact_) internal {
+ _targetedArtifacts.push(newTargetedArtifact_);
+ }
+
+ function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {
+ _targetedArtifactSelectors.push(newTargetedArtifactSelector_);
+ }
+
+ function targetContract(address newTargetedContract_) internal {
+ _targetedContracts.push(newTargetedContract_);
+ }
+
+ function targetSelector(FuzzSelector memory newTargetedSelector_) internal {
+ _targetedSelectors.push(newTargetedSelector_);
+ }
+
+ function targetSender(address newTargetedSender_) internal {
+ _targetedSenders.push(newTargetedSender_);
+ }
+
+ function targetInterface(FuzzInterface memory newTargetedInterface_) internal {
+ _targetedInterfaces.push(newTargetedInterface_);
+ }
+
+ // Functions for forge:
+ // These are called by forge to run invariant tests and don't need to be called in tests.
+
+ function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {
+ excludedArtifacts_ = _excludedArtifacts;
+ }
+
+ function excludeContracts() public view returns (address[] memory excludedContracts_) {
+ excludedContracts_ = _excludedContracts;
+ }
+
+ function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {
+ excludedSelectors_ = _excludedSelectors;
+ }
+
+ function excludeSenders() public view returns (address[] memory excludedSenders_) {
+ excludedSenders_ = _excludedSenders;
+ }
+
+ function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {
+ targetedArtifacts_ = _targetedArtifacts;
+ }
+
+ function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {
+ targetedArtifactSelectors_ = _targetedArtifactSelectors;
+ }
+
+ function targetContracts() public view returns (address[] memory targetedContracts_) {
+ targetedContracts_ = _targetedContracts;
+ }
+
+ function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {
+ targetedSelectors_ = _targetedSelectors;
+ }
+
+ function targetSenders() public view returns (address[] memory targetedSenders_) {
+ targetedSenders_ = _targetedSenders;
+ }
+
+ function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {
+ targetedInterfaces_ = _targetedInterfaces;
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdJson.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdJson.sol
new file mode 100644
index 000000000..1c9b92e4a
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdJson.sol
@@ -0,0 +1,275 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {VmSafe} from "./Vm.sol";
+
+// Helpers for parsing and writing JSON files
+// To parse:
+// ```
+// using stdJson for string;
+// string memory json = vm.readFile("");
+// json.readUint("");
+// ```
+// To write:
+// ```
+// using stdJson for string;
+// string memory json = "json";
+// json.serialize("a", uint256(123));
+// string memory semiFinal = json.serialize("b", string("test"));
+// string memory finalJson = json.serialize("c", semiFinal);
+// finalJson.write("");
+// ```
+
+library stdJson {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function keyExists(string memory json, string memory key) internal view returns (bool) {
+ return vm.keyExistsJson(json, key);
+ }
+
+ function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {
+ return vm.parseJson(json, key);
+ }
+
+ function readUint(string memory json, string memory key) internal pure returns (uint256) {
+ return vm.parseJsonUint(json, key);
+ }
+
+ function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {
+ return vm.parseJsonUintArray(json, key);
+ }
+
+ function readInt(string memory json, string memory key) internal pure returns (int256) {
+ return vm.parseJsonInt(json, key);
+ }
+
+ function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {
+ return vm.parseJsonIntArray(json, key);
+ }
+
+ function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {
+ return vm.parseJsonBytes32(json, key);
+ }
+
+ function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {
+ return vm.parseJsonBytes32Array(json, key);
+ }
+
+ function readString(string memory json, string memory key) internal pure returns (string memory) {
+ return vm.parseJsonString(json, key);
+ }
+
+ function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {
+ return vm.parseJsonStringArray(json, key);
+ }
+
+ function readAddress(string memory json, string memory key) internal pure returns (address) {
+ return vm.parseJsonAddress(json, key);
+ }
+
+ function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {
+ return vm.parseJsonAddressArray(json, key);
+ }
+
+ function readBool(string memory json, string memory key) internal pure returns (bool) {
+ return vm.parseJsonBool(json, key);
+ }
+
+ function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {
+ return vm.parseJsonBoolArray(json, key);
+ }
+
+ function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {
+ return vm.parseJsonBytes(json, key);
+ }
+
+ function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {
+ return vm.parseJsonBytesArray(json, key);
+ }
+
+ function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {
+ return keyExists(json, key) ? readUint(json, key) : defaultValue;
+ }
+
+ function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)
+ internal
+ view
+ returns (uint256[] memory)
+ {
+ return keyExists(json, key) ? readUintArray(json, key) : defaultValue;
+ }
+
+ function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {
+ return keyExists(json, key) ? readInt(json, key) : defaultValue;
+ }
+
+ function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)
+ internal
+ view
+ returns (int256[] memory)
+ {
+ return keyExists(json, key) ? readIntArray(json, key) : defaultValue;
+ }
+
+ function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)
+ internal
+ view
+ returns (bytes32)
+ {
+ return keyExists(json, key) ? readBytes32(json, key) : defaultValue;
+ }
+
+ function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)
+ internal
+ view
+ returns (bytes32[] memory)
+ {
+ return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;
+ }
+
+ function readStringOr(string memory json, string memory key, string memory defaultValue)
+ internal
+ view
+ returns (string memory)
+ {
+ return keyExists(json, key) ? readString(json, key) : defaultValue;
+ }
+
+ function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)
+ internal
+ view
+ returns (string[] memory)
+ {
+ return keyExists(json, key) ? readStringArray(json, key) : defaultValue;
+ }
+
+ function readAddressOr(string memory json, string memory key, address defaultValue)
+ internal
+ view
+ returns (address)
+ {
+ return keyExists(json, key) ? readAddress(json, key) : defaultValue;
+ }
+
+ function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)
+ internal
+ view
+ returns (address[] memory)
+ {
+ return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;
+ }
+
+ function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {
+ return keyExists(json, key) ? readBool(json, key) : defaultValue;
+ }
+
+ function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)
+ internal
+ view
+ returns (bool[] memory)
+ {
+ return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;
+ }
+
+ function readBytesOr(string memory json, string memory key, bytes memory defaultValue)
+ internal
+ view
+ returns (bytes memory)
+ {
+ return keyExists(json, key) ? readBytes(json, key) : defaultValue;
+ }
+
+ function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)
+ internal
+ view
+ returns (bytes[] memory)
+ {
+ return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;
+ }
+
+ function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {
+ return vm.serializeJson(jsonKey, rootObject);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool[] memory value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string memory value) internal returns (string memory) {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function write(string memory jsonKey, string memory path) internal {
+ vm.writeJson(jsonKey, path);
+ }
+
+ function write(string memory jsonKey, string memory path, string memory valueKey) internal {
+ vm.writeJson(jsonKey, path, valueKey);
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdMath.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdMath.sol
new file mode 100644
index 000000000..a8ecc98f7
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdMath.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+library stdMath {
+ int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;
+
+ function abs(int256 a) internal pure returns (uint256) {
+ // Required or it will fail when `a = type(int256).min`
+ if (a == INT256_MIN) {
+ return 57896044618658097711785492504343953926634992332820282019728792003956564819968;
+ }
+
+ return uint256(a > 0 ? a : -a);
+ }
+
+ function delta(uint256 a, uint256 b) internal pure returns (uint256) {
+ return a > b ? a - b : b - a;
+ }
+
+ function delta(int256 a, int256 b) internal pure returns (uint256) {
+ // a and b are of the same sign
+ // this works thanks to two's complement, the left-most bit is the sign bit
+ if ((a ^ b) > -1) {
+ return delta(abs(a), abs(b));
+ }
+
+ // a and b are of opposite signs
+ return abs(a) + abs(b);
+ }
+
+ function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {
+ // Prevent division by zero
+ require(b != 0, "stdMath percentDelta(uint256,uint256): Divisor is zero");
+ uint256 absDelta = delta(a, b);
+
+ return absDelta * 1e18 / b;
+ }
+
+ function percentDelta(int256 a, int256 b) internal pure returns (uint256) {
+ uint256 absDelta = delta(a, b);
+ uint256 absB = abs(b);
+ // Prevent division by zero
+ require(absB != 0, "stdMath percentDelta(int256,int256): Divisor is zero");
+
+ return absDelta * 1e18 / absB;
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdStorage.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdStorage.sol
new file mode 100644
index 000000000..d764182b4
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdStorage.sol
@@ -0,0 +1,475 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Vm} from "./Vm.sol";
+
+struct FindData {
+ uint256 slot;
+ uint256 offsetLeft;
+ uint256 offsetRight;
+ bool found;
+}
+
+struct StdStorage {
+ mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds;
+ bytes32[] _keys;
+ bytes4 _sig;
+ uint256 _depth;
+ address _target;
+ bytes32 _set;
+ bool _enable_packed_slots;
+ bytes _calldata;
+}
+
+library stdStorageSafe {
+ event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);
+ event WARNING_UninitedSlot(address who, uint256 slot);
+
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+ uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ function sigs(string memory sigStr) internal pure returns (bytes4) {
+ return bytes4(keccak256(bytes(sigStr)));
+ }
+
+ function getCallParams(StdStorage storage self) internal view returns (bytes memory) {
+ if (self._calldata.length == 0) {
+ return flatten(self._keys);
+ } else {
+ return self._calldata;
+ }
+ }
+
+ // Calls target contract with configured parameters
+ function callTarget(StdStorage storage self) internal view returns (bool, bytes32) {
+ bytes memory cd = abi.encodePacked(self._sig, getCallParams(self));
+ (bool success, bytes memory rdat) = self._target.staticcall(cd);
+ bytes32 result = bytesToBytes32(rdat, 32 * self._depth);
+
+ return (success, result);
+ }
+
+ // Tries mutating slot value to determine if the targeted value is stored in it.
+ // If current value is 0, then we are setting slot value to type(uint256).max
+ // Otherwise, we set it to 0. That way, return value should always be affected.
+ function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) {
+ bytes32 prevSlotValue = vm.load(self._target, slot);
+ (bool success, bytes32 prevReturnValue) = callTarget(self);
+
+ bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0);
+ vm.store(self._target, slot, testVal);
+
+ (, bytes32 newReturnValue) = callTarget(self);
+
+ vm.store(self._target, slot, prevSlotValue);
+
+ return (success && (prevReturnValue != newReturnValue));
+ }
+
+ // Tries setting one of the bits in slot to 1 until return value changes.
+ // Index of resulted bit is an offset packed slot has from left/right side
+ function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) {
+ for (uint256 offset = 0; offset < 256; offset++) {
+ uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset);
+ vm.store(self._target, slot, bytes32(valueToPut));
+
+ (bool success, bytes32 data) = callTarget(self);
+
+ if (success && (uint256(data) > 0)) {
+ return (true, offset);
+ }
+ }
+ return (false, 0);
+ }
+
+ function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) {
+ bytes32 prevSlotValue = vm.load(self._target, slot);
+
+ (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true);
+ (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false);
+
+ // `findOffset` may mutate slot value, so we are setting it to initial value
+ vm.store(self._target, slot, prevSlotValue);
+ return (foundLeft && foundRight, offsetLeft, offsetRight);
+ }
+
+ function find(StdStorage storage self) internal returns (FindData storage) {
+ return find(self, true);
+ }
+
+ /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against
+ // slot complexity:
+ // if flat, will be bytes32(uint256(uint));
+ // if map, will be keccak256(abi.encode(key, uint(slot)));
+ // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));
+ // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);
+ function find(StdStorage storage self, bool _clear) internal returns (FindData storage) {
+ address who = self._target;
+ bytes4 fsig = self._sig;
+ uint256 field_depth = self._depth;
+ bytes memory params = getCallParams(self);
+
+ // calldata to test against
+ if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {
+ if (_clear) {
+ clear(self);
+ }
+ return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ }
+ vm.record();
+ (, bytes32 callResult) = callTarget(self);
+ (bytes32[] memory reads,) = vm.accesses(address(who));
+
+ if (reads.length == 0) {
+ revert("stdStorage find(StdStorage): No storage use detected for target.");
+ } else {
+ for (uint256 i = reads.length; --i >= 0;) {
+ bytes32 prev = vm.load(who, reads[i]);
+ if (prev == bytes32(0)) {
+ emit WARNING_UninitedSlot(who, uint256(reads[i]));
+ }
+
+ if (!checkSlotMutatesCall(self, reads[i])) {
+ continue;
+ }
+
+ (uint256 offsetLeft, uint256 offsetRight) = (0, 0);
+
+ if (self._enable_packed_slots) {
+ bool found;
+ (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]);
+ if (!found) {
+ continue;
+ }
+ }
+
+ // Check that value between found offsets is equal to the current call result
+ uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight;
+
+ if (uint256(callResult) != curVal) {
+ continue;
+ }
+
+ emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i]));
+ self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] =
+ FindData(uint256(reads[i]), offsetLeft, offsetRight, true);
+ break;
+ }
+ }
+
+ require(
+ self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found,
+ "stdStorage find(StdStorage): Slot(s) not found."
+ );
+
+ if (_clear) {
+ clear(self);
+ }
+ return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ }
+
+ function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {
+ self._target = _target;
+ return self;
+ }
+
+ function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {
+ self._sig = _sig;
+ return self;
+ }
+
+ function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {
+ self._sig = sigs(_sig);
+ return self;
+ }
+
+ function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {
+ self._calldata = _calldata;
+ return self;
+ }
+
+ function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {
+ self._keys.push(bytes32(uint256(uint160(who))));
+ return self;
+ }
+
+ function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {
+ self._keys.push(bytes32(amt));
+ return self;
+ }
+
+ function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {
+ self._keys.push(key);
+ return self;
+ }
+
+ function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {
+ self._enable_packed_slots = true;
+ return self;
+ }
+
+ function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {
+ self._depth = _depth;
+ return self;
+ }
+
+ function read(StdStorage storage self) private returns (bytes memory) {
+ FindData storage data = find(self, false);
+ uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight);
+ uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight;
+ clear(self);
+ return abi.encode(value);
+ }
+
+ function read_bytes32(StdStorage storage self) internal returns (bytes32) {
+ return abi.decode(read(self), (bytes32));
+ }
+
+ function read_bool(StdStorage storage self) internal returns (bool) {
+ int256 v = read_int(self);
+ if (v == 0) return false;
+ if (v == 1) return true;
+ revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.");
+ }
+
+ function read_address(StdStorage storage self) internal returns (address) {
+ return abi.decode(read(self), (address));
+ }
+
+ function read_uint(StdStorage storage self) internal returns (uint256) {
+ return abi.decode(read(self), (uint256));
+ }
+
+ function read_int(StdStorage storage self) internal returns (int256) {
+ return abi.decode(read(self), (int256));
+ }
+
+ function parent(StdStorage storage self) internal returns (uint256, bytes32) {
+ address who = self._target;
+ uint256 field_depth = self._depth;
+ vm.startMappingRecording();
+ uint256 child = find(self, true).slot - field_depth;
+ (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));
+ if (!found) {
+ revert(
+ "stdStorage parent(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called."
+ );
+ }
+ return (uint256(parent_slot), key);
+ }
+
+ function root(StdStorage storage self) internal returns (uint256) {
+ address who = self._target;
+ uint256 field_depth = self._depth;
+ vm.startMappingRecording();
+ uint256 child = find(self, true).slot - field_depth;
+ bool found;
+ bytes32 root_slot;
+ bytes32 parent_slot;
+ (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));
+ if (!found) {
+ revert(
+ "stdStorage root(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called."
+ );
+ }
+ while (found) {
+ root_slot = parent_slot;
+ (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot));
+ }
+ return uint256(root_slot);
+ }
+
+ function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {
+ bytes32 out;
+
+ // Cap read length by remaining bytes from `offset`, and at most 32 bytes to avoid out-of-bounds
+ uint256 max = b.length > offset ? b.length - offset : 0;
+ if (max > 32) {
+ max = 32;
+ }
+ for (uint256 i = 0; i < max; i++) {
+ out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);
+ }
+ return out;
+ }
+
+ function flatten(bytes32[] memory b) private pure returns (bytes memory) {
+ bytes memory result = new bytes(b.length * 32);
+ for (uint256 i = 0; i < b.length; i++) {
+ bytes32 k = b[i];
+ assembly ("memory-safe") {
+ mstore(add(result, add(32, mul(32, i))), k)
+ }
+ }
+
+ return result;
+ }
+
+ function clear(StdStorage storage self) internal {
+ delete self._target;
+ delete self._sig;
+ delete self._keys;
+ delete self._depth;
+ delete self._enable_packed_slots;
+ delete self._calldata;
+ }
+
+ // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight`
+ // (slotValue & mask) >> offsetRight will be the value of the given packed variable
+ function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) {
+ // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight;
+ // using assembly because (1 << 256) causes overflow
+ assembly {
+ mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1))
+ }
+ }
+
+ // Returns slot value with updated packed variable.
+ function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight)
+ internal
+ pure
+ returns (bytes32 newValue)
+ {
+ return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight));
+ }
+}
+
+library stdStorage {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function sigs(string memory sigStr) internal pure returns (bytes4) {
+ return stdStorageSafe.sigs(sigStr);
+ }
+
+ function find(StdStorage storage self) internal returns (uint256) {
+ return find(self, true);
+ }
+
+ function find(StdStorage storage self, bool _clear) internal returns (uint256) {
+ return stdStorageSafe.find(self, _clear).slot;
+ }
+
+ function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {
+ return stdStorageSafe.target(self, _target);
+ }
+
+ function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {
+ return stdStorageSafe.sig(self, _sig);
+ }
+
+ function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {
+ return stdStorageSafe.sig(self, _sig);
+ }
+
+ function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, who);
+ }
+
+ function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, amt);
+ }
+
+ function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, key);
+ }
+
+ function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_calldata(self, _calldata);
+ }
+
+ function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {
+ return stdStorageSafe.enable_packed_slots(self);
+ }
+
+ function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {
+ return stdStorageSafe.depth(self, _depth);
+ }
+
+ function clear(StdStorage storage self) internal {
+ stdStorageSafe.clear(self);
+ }
+
+ function checked_write(StdStorage storage self, address who) internal {
+ checked_write(self, bytes32(uint256(uint160(who))));
+ }
+
+ function checked_write(StdStorage storage self, uint256 amt) internal {
+ checked_write(self, bytes32(amt));
+ }
+
+ function checked_write_int(StdStorage storage self, int256 val) internal {
+ checked_write(self, bytes32(uint256(val)));
+ }
+
+ function checked_write(StdStorage storage self, bool write) internal {
+ bytes32 t;
+ assembly ("memory-safe") {
+ t := write
+ }
+ checked_write(self, t);
+ }
+
+ function checked_write(StdStorage storage self, bytes32 set) internal {
+ address who = self._target;
+ bytes4 fsig = self._sig;
+ uint256 field_depth = self._depth;
+ bytes memory params = stdStorageSafe.getCallParams(self);
+
+ if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {
+ find(self, false);
+ }
+ FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ if ((data.offsetLeft + data.offsetRight) > 0) {
+ uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight));
+ require(
+ uint256(set) < maxVal,
+ string(
+ abi.encodePacked(
+ "stdStorage find(StdStorage): Packed slot. We can't fit value greater than ",
+ vm.toString(maxVal)
+ )
+ )
+ );
+ }
+ bytes32 curVal = vm.load(who, bytes32(data.slot));
+ bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight);
+
+ vm.store(who, bytes32(data.slot), valToSet);
+
+ (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self);
+
+ if (!success || callResult != set) {
+ vm.store(who, bytes32(data.slot), curVal);
+ revert("stdStorage find(StdStorage): Failed to write value.");
+ }
+ clear(self);
+ }
+
+ function read_bytes32(StdStorage storage self) internal returns (bytes32) {
+ return stdStorageSafe.read_bytes32(self);
+ }
+
+ function read_bool(StdStorage storage self) internal returns (bool) {
+ return stdStorageSafe.read_bool(self);
+ }
+
+ function read_address(StdStorage storage self) internal returns (address) {
+ return stdStorageSafe.read_address(self);
+ }
+
+ function read_uint(StdStorage storage self) internal returns (uint256) {
+ return stdStorageSafe.read_uint(self);
+ }
+
+ function read_int(StdStorage storage self) internal returns (int256) {
+ return stdStorageSafe.read_int(self);
+ }
+
+ function parent(StdStorage storage self) internal returns (uint256, bytes32) {
+ return stdStorageSafe.parent(self);
+ }
+
+ function root(StdStorage storage self) internal returns (uint256) {
+ return stdStorageSafe.root(self);
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdStyle.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdStyle.sol
new file mode 100644
index 000000000..ad63400fb
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdStyle.sol
@@ -0,0 +1,333 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {VmSafe} from "./Vm.sol";
+
+library StdStyle {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ string constant RED = "\u001b[91m";
+ string constant GREEN = "\u001b[92m";
+ string constant YELLOW = "\u001b[93m";
+ string constant BLUE = "\u001b[94m";
+ string constant MAGENTA = "\u001b[95m";
+ string constant CYAN = "\u001b[96m";
+ string constant BOLD = "\u001b[1m";
+ string constant DIM = "\u001b[2m";
+ string constant ITALIC = "\u001b[3m";
+ string constant UNDERLINE = "\u001b[4m";
+ string constant INVERSE = "\u001b[7m";
+ string constant RESET = "\u001b[0m";
+
+ function styleConcat(string memory style, string memory self) private pure returns (string memory) {
+ return string(abi.encodePacked(style, self, RESET));
+ }
+
+ function red(string memory self) internal pure returns (string memory) {
+ return styleConcat(RED, self);
+ }
+
+ function red(uint256 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(int256 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(address self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(bool self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function redBytes(bytes memory self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function redBytes32(bytes32 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function green(string memory self) internal pure returns (string memory) {
+ return styleConcat(GREEN, self);
+ }
+
+ function green(uint256 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(int256 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(address self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(bool self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function greenBytes(bytes memory self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function greenBytes32(bytes32 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function yellow(string memory self) internal pure returns (string memory) {
+ return styleConcat(YELLOW, self);
+ }
+
+ function yellow(uint256 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(int256 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(address self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(bool self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellowBytes(bytes memory self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellowBytes32(bytes32 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function blue(string memory self) internal pure returns (string memory) {
+ return styleConcat(BLUE, self);
+ }
+
+ function blue(uint256 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(int256 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(address self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(bool self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blueBytes(bytes memory self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blueBytes32(bytes32 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function magenta(string memory self) internal pure returns (string memory) {
+ return styleConcat(MAGENTA, self);
+ }
+
+ function magenta(uint256 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(int256 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(address self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(bool self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magentaBytes(bytes memory self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magentaBytes32(bytes32 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function cyan(string memory self) internal pure returns (string memory) {
+ return styleConcat(CYAN, self);
+ }
+
+ function cyan(uint256 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(int256 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(address self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(bool self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyanBytes(bytes memory self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyanBytes32(bytes32 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function bold(string memory self) internal pure returns (string memory) {
+ return styleConcat(BOLD, self);
+ }
+
+ function bold(uint256 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(int256 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(address self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(bool self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function boldBytes(bytes memory self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function boldBytes32(bytes32 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function dim(string memory self) internal pure returns (string memory) {
+ return styleConcat(DIM, self);
+ }
+
+ function dim(uint256 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(int256 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(address self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(bool self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dimBytes(bytes memory self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dimBytes32(bytes32 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function italic(string memory self) internal pure returns (string memory) {
+ return styleConcat(ITALIC, self);
+ }
+
+ function italic(uint256 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(int256 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(address self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(bool self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italicBytes(bytes memory self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italicBytes32(bytes32 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function underline(string memory self) internal pure returns (string memory) {
+ return styleConcat(UNDERLINE, self);
+ }
+
+ function underline(uint256 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(int256 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(address self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(bool self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underlineBytes(bytes memory self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underlineBytes32(bytes32 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function inverse(string memory self) internal pure returns (string memory) {
+ return styleConcat(INVERSE, self);
+ }
+
+ function inverse(uint256 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(int256 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(address self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(bool self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverseBytes(bytes memory self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverseBytes32(bytes32 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdToml.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdToml.sol
new file mode 100644
index 000000000..3e94ed99f
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdToml.sol
@@ -0,0 +1,275 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {VmSafe} from "./Vm.sol";
+
+// Helpers for parsing and writing TOML files
+// To parse:
+// ```
+// using stdToml for string;
+// string memory toml = vm.readFile("");
+// toml.readUint("");
+// ```
+// To write:
+// ```
+// using stdToml for string;
+// string memory json = "json";
+// json.serialize("a", uint256(123));
+// string memory semiFinal = json.serialize("b", string("test"));
+// string memory finalJson = json.serialize("c", semiFinal);
+// finalJson.write("");
+// ```
+
+library stdToml {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function keyExists(string memory toml, string memory key) internal view returns (bool) {
+ return vm.keyExistsToml(toml, key);
+ }
+
+ function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) {
+ return vm.parseToml(toml, key);
+ }
+
+ function readUint(string memory toml, string memory key) internal pure returns (uint256) {
+ return vm.parseTomlUint(toml, key);
+ }
+
+ function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) {
+ return vm.parseTomlUintArray(toml, key);
+ }
+
+ function readInt(string memory toml, string memory key) internal pure returns (int256) {
+ return vm.parseTomlInt(toml, key);
+ }
+
+ function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) {
+ return vm.parseTomlIntArray(toml, key);
+ }
+
+ function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) {
+ return vm.parseTomlBytes32(toml, key);
+ }
+
+ function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) {
+ return vm.parseTomlBytes32Array(toml, key);
+ }
+
+ function readString(string memory toml, string memory key) internal pure returns (string memory) {
+ return vm.parseTomlString(toml, key);
+ }
+
+ function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) {
+ return vm.parseTomlStringArray(toml, key);
+ }
+
+ function readAddress(string memory toml, string memory key) internal pure returns (address) {
+ return vm.parseTomlAddress(toml, key);
+ }
+
+ function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) {
+ return vm.parseTomlAddressArray(toml, key);
+ }
+
+ function readBool(string memory toml, string memory key) internal pure returns (bool) {
+ return vm.parseTomlBool(toml, key);
+ }
+
+ function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) {
+ return vm.parseTomlBoolArray(toml, key);
+ }
+
+ function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) {
+ return vm.parseTomlBytes(toml, key);
+ }
+
+ function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) {
+ return vm.parseTomlBytesArray(toml, key);
+ }
+
+ function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) {
+ return keyExists(toml, key) ? readUint(toml, key) : defaultValue;
+ }
+
+ function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue)
+ internal
+ view
+ returns (uint256[] memory)
+ {
+ return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue;
+ }
+
+ function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) {
+ return keyExists(toml, key) ? readInt(toml, key) : defaultValue;
+ }
+
+ function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue)
+ internal
+ view
+ returns (int256[] memory)
+ {
+ return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue;
+ }
+
+ function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue)
+ internal
+ view
+ returns (bytes32)
+ {
+ return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue;
+ }
+
+ function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue)
+ internal
+ view
+ returns (bytes32[] memory)
+ {
+ return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue;
+ }
+
+ function readStringOr(string memory toml, string memory key, string memory defaultValue)
+ internal
+ view
+ returns (string memory)
+ {
+ return keyExists(toml, key) ? readString(toml, key) : defaultValue;
+ }
+
+ function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue)
+ internal
+ view
+ returns (string[] memory)
+ {
+ return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue;
+ }
+
+ function readAddressOr(string memory toml, string memory key, address defaultValue)
+ internal
+ view
+ returns (address)
+ {
+ return keyExists(toml, key) ? readAddress(toml, key) : defaultValue;
+ }
+
+ function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue)
+ internal
+ view
+ returns (address[] memory)
+ {
+ return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue;
+ }
+
+ function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) {
+ return keyExists(toml, key) ? readBool(toml, key) : defaultValue;
+ }
+
+ function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue)
+ internal
+ view
+ returns (bool[] memory)
+ {
+ return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue;
+ }
+
+ function readBytesOr(string memory toml, string memory key, bytes memory defaultValue)
+ internal
+ view
+ returns (bytes memory)
+ {
+ return keyExists(toml, key) ? readBytes(toml, key) : defaultValue;
+ }
+
+ function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue)
+ internal
+ view
+ returns (bytes[] memory)
+ {
+ return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue;
+ }
+
+ function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {
+ return vm.serializeJson(jsonKey, rootObject);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool[] memory value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string memory value) internal returns (string memory) {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function write(string memory jsonKey, string memory path) internal {
+ vm.writeToml(jsonKey, path);
+ }
+
+ function write(string memory jsonKey, string memory path, string memory valueKey) internal {
+ vm.writeToml(jsonKey, path, valueKey);
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdUtils.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdUtils.sol
new file mode 100644
index 000000000..7ecf1bb6c
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdUtils.sol
@@ -0,0 +1,200 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {IMulticall3} from "./interfaces/IMulticall3.sol";
+import {StdConstants} from "./StdConstants.sol";
+import {VmSafe} from "./Vm.sol";
+
+abstract contract StdUtils {
+ /*//////////////////////////////////////////////////////////////////////////
+ CONSTANTS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+ address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
+ uint256 private constant INT256_MIN_ABS =
+ 57896044618658097711785492504343953926634992332820282019728792003956564819968;
+ uint256 private constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+ uint256 private constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ /*//////////////////////////////////////////////////////////////////////////
+ INTERNAL FUNCTIONS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {
+ require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min.");
+ // If x is between min and max, return x directly. This is to ensure that dictionary values
+ // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188
+ if (x >= min && x <= max) return x;
+
+ uint256 size = max - min + 1;
+
+ // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.
+ // This helps ensure coverage of the min/max values.
+ if (x <= 3 && size > x) return min + x;
+ if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);
+
+ // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.
+ if (x > max) {
+ uint256 diff = x - max;
+ uint256 rem = diff % size;
+ if (rem == 0) return max;
+ result = min + rem - 1;
+ } else if (x < min) {
+ uint256 diff = min - x;
+ uint256 rem = diff % size;
+ if (rem == 0) return min;
+ result = max - rem + 1;
+ }
+ }
+
+ function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {
+ result = _bound(x, min, max);
+ }
+
+ function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {
+ require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min.");
+
+ // Shifting all int256 values to uint256 to use _bound function. The range of two types are:
+ // int256 : -(2**255) ~ (2**255 - 1)
+ // uint256: 0 ~ (2**256 - 1)
+ // So, add 2**255, INT256_MIN_ABS to the integer values.
+ //
+ // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.
+ // So, use `~uint256(x) + 1` instead.
+ uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);
+ uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);
+ uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);
+
+ uint256 y = _bound(_x, _min, _max);
+
+ // To move it back to int256 value, subtract INT256_MIN_ABS at here.
+ result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);
+ }
+
+ function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {
+ result = _bound(x, min, max);
+ }
+
+ function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) {
+ result = _bound(privateKey, 1, SECP256K1_ORDER - 1);
+ }
+
+ function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {
+ require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32.");
+ return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));
+ }
+
+ /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce
+ function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {
+ console2_log_StdUtils("computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead.");
+ return vm.computeCreateAddress(deployer, nonce);
+ }
+
+ function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)
+ internal
+ pure
+ virtual
+ returns (address)
+ {
+ console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.");
+ return vm.computeCreate2Address(salt, initcodeHash, deployer);
+ }
+
+ /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {
+ console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.");
+ return vm.computeCreate2Address(salt, initCodeHash);
+ }
+
+ /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments
+ /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode
+ function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {
+ return hashInitCode(creationCode, "");
+ }
+
+ /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2
+ /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode
+ /// @param args the ABI-encoded arguments to the constructor of C
+ function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {
+ return keccak256(abi.encodePacked(creationCode, args));
+ }
+
+ // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.
+ function getTokenBalances(address token, address[] memory addresses)
+ internal
+ virtual
+ returns (uint256[] memory balances)
+ {
+ uint256 tokenCodeSize;
+ assembly {
+ tokenCodeSize := extcodesize(token)
+ }
+ require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract.");
+
+ // ABI encode the aggregate call to Multicall3.
+ uint256 length = addresses.length;
+ IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ // 0x70a08231 = bytes4("balanceOf(address)"))
+ calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});
+ }
+
+ // Make the aggregate call.
+ (, bytes[] memory returnData) = StdConstants.MULTICALL3_ADDRESS.aggregate(calls);
+
+ // ABI decode the return data and return the balances.
+ balances = new uint256[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ balances[i] = abi.decode(returnData[i], (uint256));
+ }
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ PRIVATE FUNCTIONS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {
+ return address(uint160(uint256(bytesValue)));
+ }
+
+ // This section is used to prevent the compilation of console, which shortens the compilation time when console is
+ // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid
+ // any breaking changes to function signatures.
+ function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn)
+ internal
+ pure
+ returns (function(bytes memory) internal pure fnOut)
+ {
+ assembly {
+ fnOut := fnIn
+ }
+ }
+
+ function _sendLogPayload(bytes memory payload) internal pure {
+ _castLogPayloadViewToPure(_sendLogPayloadView)(payload);
+ }
+
+ function _sendLogPayloadView(bytes memory payload) private view {
+ uint256 payloadLength = payload.length;
+ address consoleAddress = CONSOLE2_ADDRESS;
+ assembly ("memory-safe") {
+ let payloadStart := add(payload, 32)
+ let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
+ }
+ }
+
+ function console2_log_StdUtils(string memory p0) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function console2_log_StdUtils(string memory p0, uint256 p1) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
+ }
+
+ function console2_log_StdUtils(string memory p0, string memory p1) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Test.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Test.sol
new file mode 100644
index 000000000..af91dd81c
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Test.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+// 💬 ABOUT
+// Forge Std's default Test.
+
+// 🧩 MODULES
+import {console} from "./console.sol";
+import {console2} from "./console2.sol";
+import {safeconsole} from "./safeconsole.sol";
+import {StdAssertions} from "./StdAssertions.sol";
+import {StdChains} from "./StdChains.sol";
+import {StdCheats} from "./StdCheats.sol";
+import {StdConstants} from "./StdConstants.sol";
+import {stdError} from "./StdError.sol";
+import {StdInvariant} from "./StdInvariant.sol";
+import {stdJson} from "./StdJson.sol";
+import {stdMath} from "./StdMath.sol";
+import {StdStorage, stdStorage} from "./StdStorage.sol";
+import {StdStyle} from "./StdStyle.sol";
+import {stdToml} from "./StdToml.sol";
+import {StdUtils} from "./StdUtils.sol";
+import {Vm} from "./Vm.sol";
+
+// 📦 BOILERPLATE
+import {TestBase} from "./Base.sol";
+
+// ⭐️ TEST
+abstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils {
+ // Note: IS_TEST() must return true.
+ bool public IS_TEST = true;
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Vm.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Vm.sol
new file mode 100644
index 000000000..5703661ea
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Vm.sol
@@ -0,0 +1,2500 @@
+// Automatically @generated by scripts/vm.py. Do not modify manually.
+
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may
+/// result in Script simulations differing from on-chain execution. It is recommended to only use
+/// these cheats in scripts.
+interface VmSafe {
+ /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.
+ enum CallerMode {
+ // No caller modification is currently active.
+ None,
+ // A one time broadcast triggered by a `vm.broadcast()` call is currently active.
+ Broadcast,
+ // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.
+ RecurrentBroadcast,
+ // A one time prank triggered by a `vm.prank()` call is currently active.
+ Prank,
+ // A recurrent prank triggered by a `vm.startPrank()` call is currently active.
+ RecurrentPrank
+ }
+
+ /// The kind of account access that occurred.
+ enum AccountAccessKind {
+ // The account was called.
+ Call,
+ // The account was called via delegatecall.
+ DelegateCall,
+ // The account was called via callcode.
+ CallCode,
+ // The account was called via staticcall.
+ StaticCall,
+ // The account was created.
+ Create,
+ // The account was selfdestructed.
+ SelfDestruct,
+ // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).
+ Resume,
+ // The account's balance was read.
+ Balance,
+ // The account's codesize was read.
+ Extcodesize,
+ // The account's codehash was read.
+ Extcodehash,
+ // The account's code was copied.
+ Extcodecopy
+ }
+
+ /// Forge execution contexts.
+ enum ForgeContext {
+ // Test group execution context (test, coverage or snapshot).
+ TestGroup,
+ // `forge test` execution context.
+ Test,
+ // `forge coverage` execution context.
+ Coverage,
+ // `forge snapshot` execution context.
+ Snapshot,
+ // Script group execution context (dry run, broadcast or resume).
+ ScriptGroup,
+ // `forge script` execution context.
+ ScriptDryRun,
+ // `forge script --broadcast` execution context.
+ ScriptBroadcast,
+ // `forge script --resume` execution context.
+ ScriptResume,
+ // Unknown `forge` execution context.
+ Unknown
+ }
+
+ /// The transaction type (`txType`) of the broadcast.
+ enum BroadcastTxType {
+ // Represents a CALL broadcast tx.
+ Call,
+ // Represents a CREATE broadcast tx.
+ Create,
+ // Represents a CREATE2 broadcast tx.
+ Create2
+ }
+
+ /// An Ethereum log. Returned by `getRecordedLogs`.
+ struct Log {
+ // The topics of the log, including the signature, if any.
+ bytes32[] topics;
+ // The raw data of the log.
+ bytes data;
+ // The address of the log's emitter.
+ address emitter;
+ }
+
+ /// An RPC URL and its alias. Returned by `rpcUrlStructs`.
+ struct Rpc {
+ // The alias of the RPC URL.
+ string key;
+ // The RPC URL.
+ string url;
+ }
+
+ /// An RPC log object. Returned by `eth_getLogs`.
+ struct EthGetLogs {
+ // The address of the log's emitter.
+ address emitter;
+ // The topics of the log, including the signature, if any.
+ bytes32[] topics;
+ // The raw data of the log.
+ bytes data;
+ // The block hash.
+ bytes32 blockHash;
+ // The block number.
+ uint64 blockNumber;
+ // The transaction hash.
+ bytes32 transactionHash;
+ // The transaction index in the block.
+ uint64 transactionIndex;
+ // The log index.
+ uint256 logIndex;
+ // Whether the log was removed.
+ bool removed;
+ }
+
+ /// A single entry in a directory listing. Returned by `readDir`.
+ struct DirEntry {
+ // The error message, if any.
+ string errorMessage;
+ // The path of the entry.
+ string path;
+ // The depth of the entry.
+ uint64 depth;
+ // Whether the entry is a directory.
+ bool isDir;
+ // Whether the entry is a symlink.
+ bool isSymlink;
+ }
+
+ /// Metadata information about a file.
+ /// This structure is returned from the `fsMetadata` function and represents known
+ /// metadata about a file such as its permissions, size, modification
+ /// times, etc.
+ struct FsMetadata {
+ // True if this metadata is for a directory.
+ bool isDir;
+ // True if this metadata is for a symlink.
+ bool isSymlink;
+ // The size of the file, in bytes, this metadata is for.
+ uint256 length;
+ // True if this metadata is for a readonly (unwritable) file.
+ bool readOnly;
+ // The last modification time listed in this metadata.
+ uint256 modified;
+ // The last access time of this metadata.
+ uint256 accessed;
+ // The creation time listed in this metadata.
+ uint256 created;
+ }
+
+ /// A wallet with a public and private key.
+ struct Wallet {
+ // The wallet's address.
+ address addr;
+ // The wallet's public key `X`.
+ uint256 publicKeyX;
+ // The wallet's public key `Y`.
+ uint256 publicKeyY;
+ // The wallet's private key.
+ uint256 privateKey;
+ }
+
+ /// The result of a `tryFfi` call.
+ struct FfiResult {
+ // The exit code of the call.
+ int32 exitCode;
+ // The optionally hex-decoded `stdout` data.
+ bytes stdout;
+ // The `stderr` data.
+ bytes stderr;
+ }
+
+ /// Information on the chain and fork.
+ struct ChainInfo {
+ // The fork identifier. Set to zero if no fork is active.
+ uint256 forkId;
+ // The chain ID of the current fork.
+ uint256 chainId;
+ }
+
+ /// Information about a blockchain.
+ struct Chain {
+ // The chain name.
+ string name;
+ // The chain's Chain ID.
+ uint256 chainId;
+ // The chain's alias. (i.e. what gets specified in `foundry.toml`).
+ string chainAlias;
+ // A default RPC endpoint for this chain.
+ string rpcUrl;
+ }
+
+ /// The result of a `stopAndReturnStateDiff` call.
+ struct AccountAccess {
+ // The chain and fork the access occurred.
+ ChainInfo chainInfo;
+ // The kind of account access that determines what the account is.
+ // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.
+ // If kind is Create, then the account is the newly created account.
+ // If kind is SelfDestruct, then the account is the selfdestruct recipient.
+ // If kind is a Resume, then account represents a account context that has resumed.
+ AccountAccessKind kind;
+ // The account that was accessed.
+ // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.
+ address account;
+ // What accessed the account.
+ address accessor;
+ // If the account was initialized or empty prior to the access.
+ // An account is considered initialized if it has code, a
+ // non-zero nonce, or a non-zero balance.
+ bool initialized;
+ // The previous balance of the accessed account.
+ uint256 oldBalance;
+ // The potential new balance of the accessed account.
+ // That is, all balance changes are recorded here, even if reverts occurred.
+ uint256 newBalance;
+ // Code of the account deployed by CREATE.
+ bytes deployedCode;
+ // Value passed along with the account access
+ uint256 value;
+ // Input data provided to the CREATE or CALL
+ bytes data;
+ // If this access reverted in either the current or parent context.
+ bool reverted;
+ // An ordered list of storage accesses made during an account access operation.
+ StorageAccess[] storageAccesses;
+ // Call depth traversed during the recording of state differences
+ uint64 depth;
+ // The previous nonce of the accessed account.
+ uint64 oldNonce;
+ // The new nonce of the accessed account.
+ uint64 newNonce;
+ }
+
+ /// The storage accessed during an `AccountAccess`.
+ struct StorageAccess {
+ // The account whose storage was accessed.
+ address account;
+ // The slot that was accessed.
+ bytes32 slot;
+ // If the access was a write.
+ bool isWrite;
+ // The previous value of the slot.
+ bytes32 previousValue;
+ // The new value of the slot.
+ bytes32 newValue;
+ // If the access was reverted.
+ bool reverted;
+ }
+
+ /// Gas used. Returned by `lastCallGas`.
+ struct Gas {
+ // The gas limit of the call.
+ uint64 gasLimit;
+ // The total gas used.
+ uint64 gasTotalUsed;
+ // DEPRECATED: The amount of gas used for memory expansion. Ref:
+ uint64 gasMemoryUsed;
+ // The amount of gas refunded.
+ int64 gasRefunded;
+ // The amount of gas remaining.
+ uint64 gasRemaining;
+ }
+
+ /// The result of the `stopDebugTraceRecording` call
+ struct DebugStep {
+ // The stack before executing the step of the run.
+ // stack\[0\] represents the top of the stack.
+ // and only stack data relevant to the opcode execution is contained.
+ uint256[] stack;
+ // The memory input data before executing the step of the run.
+ // only input data relevant to the opcode execution is contained.
+ // e.g. for MLOAD, it will have memory\[offset:offset+32\] copied here.
+ // the offset value can be get by the stack data.
+ bytes memoryInput;
+ // The opcode that was accessed.
+ uint8 opcode;
+ // The call depth of the step.
+ uint64 depth;
+ // Whether the call end up with out of gas error.
+ bool isOutOfGas;
+ // The contract address where the opcode is running
+ address contractAddr;
+ }
+
+ /// Represents a transaction's broadcast details.
+ struct BroadcastTxSummary {
+ // The hash of the transaction that was broadcasted
+ bytes32 txHash;
+ // Represent the type of transaction among CALL, CREATE, CREATE2
+ BroadcastTxType txType;
+ // The address of the contract that was called or created.
+ // This is address of the contract that is created if the txType is CREATE or CREATE2.
+ address contractAddress;
+ // The block number the transaction landed in.
+ uint64 blockNumber;
+ // Status of the transaction, retrieved from the transaction receipt.
+ bool success;
+ }
+
+ /// Holds a signed EIP-7702 authorization for an authority account to delegate to an implementation.
+ struct SignedDelegation {
+ // The y-parity of the recovered secp256k1 signature (0 or 1).
+ uint8 v;
+ // First 32 bytes of the signature.
+ bytes32 r;
+ // Second 32 bytes of the signature.
+ bytes32 s;
+ // The current nonce of the authority account at signing time.
+ // Used to ensure signature can't be replayed after account nonce changes.
+ uint64 nonce;
+ // Address of the contract implementation that will be delegated to.
+ // Gets encoded into delegation code: 0xef0100 || implementation.
+ address implementation;
+ }
+
+ /// Represents a "potential" revert reason from a single subsequent call when using `vm.assumeNoReverts`.
+ /// Reverts that match will result in a FOUNDRY::ASSUME rejection, whereas unmatched reverts will be surfaced
+ /// as normal.
+ struct PotentialRevert {
+ // The allowed origin of the revert opcode; address(0) allows reverts from any address
+ address reverter;
+ // When true, only matches on the beginning of the revert data, otherwise, matches on entire revert data
+ bool partialMatch;
+ // The data to use to match encountered reverts
+ bytes revertData;
+ }
+
+ /// An EIP-2930 access list item.
+ struct AccessListItem {
+ // The address to be added in access list.
+ address target;
+ // The storage keys to be added in access list.
+ bytes32[] storageKeys;
+ }
+
+ // ======== Crypto ========
+
+ /// Derives a private key from the name, labels the account with that name, and returns the wallet.
+ function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);
+
+ /// Generates a wallet from the private key and returns the wallet.
+ function createWallet(uint256 privateKey) external returns (Wallet memory wallet);
+
+ /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.
+ function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);
+
+ /// Derive a private key from a provided mnemonic string (or mnemonic file path)
+ /// at the derivation path `m/44'/60'/0'/0/{index}`.
+ function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnemonic string (or mnemonic file path)
+ /// at `{derivationPath}{index}`.
+ function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnemonic string (or mnemonic file path) in the specified language
+ /// at the derivation path `m/44'/60'/0'/0/{index}`.
+ function deriveKey(string calldata mnemonic, uint32 index, string calldata language)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnemonic string (or mnemonic file path) in the specified language
+ /// at `{derivationPath}{index}`.
+ function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derives secp256r1 public key from the provided `privateKey`.
+ function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);
+
+ /// Adds a private key to the local forge wallet and returns the address.
+ function rememberKey(uint256 privateKey) external returns (address keyAddr);
+
+ /// Derive a set number of wallets from a mnemonic at the derivation path `m/44'/60'/0'/0/{0..count}`.
+ /// The respective private keys are saved to the local forge wallet for later use and their addresses are returned.
+ function rememberKeys(string calldata mnemonic, string calldata derivationPath, uint32 count)
+ external
+ returns (address[] memory keyAddrs);
+
+ /// Derive a set number of wallets from a mnemonic in the specified language at the derivation path `m/44'/60'/0'/0/{0..count}`.
+ /// The respective private keys are saved to the local forge wallet for later use and their addresses are returned.
+ function rememberKeys(
+ string calldata mnemonic,
+ string calldata derivationPath,
+ string calldata language,
+ uint32 count
+ ) external returns (address[] memory keyAddrs);
+
+ /// Signs data with a `Wallet`.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with `privateKey` using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ /// If `--sender` is provided, the signer with provided address is used, otherwise,
+ /// if exactly one signer is provided to the script, that signer is used.
+ /// Raises error if signer passed through `--sender` does not match any unlocked signers or
+ /// if `--sender` is not provided and not exactly one signer is passed to the script.
+ function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ /// Raises error if none of the signers passed into the script have provided address.
+ function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with `privateKey` using the secp256r1 curve.
+ function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);
+
+ /// Signs `digest` with `privateKey` on the secp256k1 curve, using the given `nonce`
+ /// as the raw ephemeral k value in ECDSA (instead of deriving it deterministically).
+ function signWithNonceUnsafe(uint256 privateKey, bytes32 digest, uint256 nonce)
+ external
+ pure
+ returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs data with a `Wallet`.
+ function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with `privateKey` using the secp256k1 curve.
+ function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// If `--sender` is provided, the signer with provided address is used, otherwise,
+ /// if exactly one signer is provided to the script, that signer is used.
+ /// Raises error if signer passed through `--sender` does not match any unlocked signers or
+ /// if `--sender` is not provided and not exactly one signer is passed to the script.
+ function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Raises error if none of the signers passed into the script have provided address.
+ function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ // ======== Environment ========
+
+ /// Gets the environment variable `name` and parses it as `address`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envAddress(string calldata name) external view returns (address value);
+
+ /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bool`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBool(string calldata name) external view returns (bool value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes32`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes32(string calldata name) external view returns (bytes32 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes(string calldata name) external view returns (bytes memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);
+
+ /// Gets the environment variable `name` and returns true if it exists, else returns false.
+ function envExists(string calldata name) external view returns (bool result);
+
+ /// Gets the environment variable `name` and parses it as `int256`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envInt(string calldata name) external view returns (int256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bool`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bool defaultValue) external view returns (bool value);
+
+ /// Gets the environment variable `name` and parses it as `uint256`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)
+ external
+ view
+ returns (address[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)
+ external
+ view
+ returns (bytes32[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)
+ external
+ view
+ returns (string[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)
+ external
+ view
+ returns (bytes[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `int256`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);
+
+ /// Gets the environment variable `name` and parses it as `address`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, address defaultValue) external view returns (address value);
+
+ /// Gets the environment variable `name` and parses it as `bytes32`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);
+
+ /// Gets the environment variable `name` and parses it as `string`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)
+ external
+ view
+ returns (bool[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)
+ external
+ view
+ returns (uint256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)
+ external
+ view
+ returns (int256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `string`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envString(string calldata name) external view returns (string memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envString(string calldata name, string calldata delim) external view returns (string[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `uint256`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envUint(string calldata name) external view returns (uint256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);
+
+ /// Returns true if `forge` command was executed in given context.
+ function isContext(ForgeContext context) external view returns (bool result);
+
+ /// Resolves the env variable placeholders of a given input string.
+ function resolveEnv(string calldata input) external returns (string memory);
+
+ /// Sets environment variables.
+ function setEnv(string calldata name, string calldata value) external;
+
+ // ======== EVM ========
+
+ /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.
+ function accesses(address target) external view returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);
+
+ /// Gets the address for a given private key.
+ function addr(uint256 privateKey) external pure returns (address keyAddr);
+
+ /// Gets all the logs according to specified filter.
+ function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)
+ external
+ view
+ returns (EthGetLogs[] memory logs);
+
+ /// Gets the current `block.blobbasefee`.
+ /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlobBaseFee() external view returns (uint256 blobBaseFee);
+
+ /// Gets the current `block.number`.
+ /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlockNumber() external view returns (uint256 height);
+
+ /// Gets the current `block.timestamp`.
+ /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlockTimestamp() external view returns (uint256 timestamp);
+
+ /// Gets the current `block.chainid` of the currently selected environment.
+ /// You should use this instead of `block.chainid` if you use `vm.selectFork` or `vm.createSelectFork`, as `block.chainid` could be assumed
+ /// to be constant across a transaction, and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getChainId() external view returns (uint256 blockChainId);
+
+ /// Returns the test or script execution evm version.
+ /// **Note:** The execution evm version is not the same as the compilation one.
+ function getEvmVersion() external pure returns (string memory evm);
+
+ /// Gets the map key and parent of a mapping at a given slot, for a given address.
+ function getMappingKeyAndParentOf(address target, bytes32 elementSlot)
+ external
+ view
+ returns (bool found, bytes32 key, bytes32 parent);
+
+ /// Gets the number of elements in the mapping at the given slot, for a given address.
+ function getMappingLength(address target, bytes32 mappingSlot) external view returns (uint256 length);
+
+ /// Gets the elements at index idx of the mapping at the given slot, for a given address. The
+ /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).
+ function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external view returns (bytes32 value);
+
+ /// Gets the nonce of an account.
+ function getNonce(address account) external view returns (uint64 nonce);
+
+ /// Get the nonce of a `Wallet`.
+ function getNonce(Wallet calldata wallet) external view returns (uint64 nonce);
+
+ /// Gets the RLP encoded block header for a given block number.
+ /// Returns the block header in the same format as `cast block --raw`.
+ function getRawBlockHeader(uint256 blockNumber) external view returns (bytes memory rlpHeader);
+
+ /// Gets all the recorded logs.
+ function getRecordedLogs() external view returns (Log[] memory logs);
+
+ /// Returns state diffs from current `vm.startStateDiffRecording` session.
+ function getStateDiff() external view returns (string memory diff);
+
+ /// Returns state diffs from current `vm.startStateDiffRecording` session, in json format.
+ function getStateDiffJson() external view returns (string memory diff);
+
+ /// Returns an array of `StorageAccess` from current `vm.stateStateDiffRecording` session
+ function getStorageAccesses() external view returns (StorageAccess[] memory storageAccesses);
+
+ /// Returns an array of storage slots occupied by the specified variable.
+ function getStorageSlots(address target, string calldata variableName)
+ external
+ view
+ returns (uint256[] memory slots);
+
+ /// Gets the gas used in the last call from the callee perspective.
+ function lastCallGas() external view returns (Gas memory gas);
+
+ /// Loads a storage slot from an address.
+ function load(address target, bytes32 slot) external view returns (bytes32 data);
+
+ /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.
+ function pauseGasMetering() external;
+
+ /// Records all storage reads and writes. Use `accesses` to get the recorded data.
+ /// Subsequent calls to `record` will clear the previous data.
+ function record() external;
+
+ /// Record all the transaction logs.
+ function recordLogs() external;
+
+ /// Reset gas metering (i.e. gas usage is set to gas limit).
+ function resetGasMetering() external;
+
+ /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.
+ function resumeGasMetering() external;
+
+ /// Performs an Ethereum JSON-RPC request to the current fork URL.
+ function rpc(string calldata method, string calldata params) external returns (bytes memory data);
+
+ /// Performs an Ethereum JSON-RPC request to the given endpoint.
+ function rpc(string calldata urlOrAlias, string calldata method, string calldata params)
+ external
+ returns (bytes memory data);
+
+ /// Set the exact test or script execution evm version, e.g. `berlin`, `cancun`.
+ /// **Note:** The execution evm version is not the same as the compilation one.
+ function setEvmVersion(string calldata evm) external;
+
+ /// Records the debug trace during the run.
+ function startDebugTraceRecording() external;
+
+ /// Starts recording all map SSTOREs for later retrieval.
+ function startMappingRecording() external;
+
+ /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,
+ /// along with the context of the calls
+ function startStateDiffRecording() external;
+
+ /// Stop debug trace recording and returns the recorded debug trace.
+ function stopAndReturnDebugTraceRecording() external returns (DebugStep[] memory step);
+
+ /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.
+ function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);
+
+ /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.
+ function stopMappingRecording() external;
+
+ /// Stops recording storage reads and writes.
+ function stopRecord() external;
+
+ // ======== Filesystem ========
+
+ /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.
+ /// `path` is relative to the project root.
+ function closeFile(string calldata path) external;
+
+ /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.
+ /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.
+ /// Both `from` and `to` are relative to the project root.
+ function copyFile(string calldata from, string calldata to) external returns (uint64 copied);
+
+ /// Creates a new, empty directory at the provided path.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - User lacks permissions to modify `path`.
+ /// - A parent of the given path doesn't exist and `recursive` is false.
+ /// - `path` already exists and `recursive` is false.
+ /// `path` is relative to the project root.
+ function createDir(string calldata path, bool recursive) external;
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Reverts if the target artifact contains unlinked library placeholders.
+ function deployCode(string calldata artifactPath) external returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Reverts if the target artifact contains unlinked library placeholders.
+ /// Additionally accepts abi-encoded constructor arguments.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs)
+ external
+ returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Reverts if the target artifact contains unlinked library placeholders.
+ /// Additionally accepts `msg.value`.
+ function deployCode(string calldata artifactPath, uint256 value) external returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Reverts if the target artifact contains unlinked library placeholders.
+ /// Additionally accepts abi-encoded constructor arguments and `msg.value`.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs, uint256 value)
+ external
+ returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Reverts if the target artifact contains unlinked library placeholders.
+ function deployCode(string calldata artifactPath, bytes32 salt) external returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Reverts if the target artifact contains unlinked library placeholders.
+ /// Additionally accepts abi-encoded constructor arguments.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs, bytes32 salt)
+ external
+ returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Reverts if the target artifact contains unlinked library placeholders.
+ /// Additionally accepts `msg.value`.
+ function deployCode(string calldata artifactPath, uint256 value, bytes32 salt)
+ external
+ returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Reverts if the target artifact contains unlinked library placeholders.
+ /// Additionally accepts abi-encoded constructor arguments and `msg.value`.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs, uint256 value, bytes32 salt)
+ external
+ returns (address deployedAddress);
+
+ /// Returns true if the given path points to an existing entity, else returns false.
+ function exists(string calldata path) external view returns (bool result);
+
+ /// Performs a foreign function call via the terminal.
+ function ffi(string[] calldata commandInput) external returns (bytes memory result);
+
+ /// Given a path, query the file system to get information about a file, directory, etc.
+ function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);
+
+ /// Gets the artifact path from code (aka. creation code).
+ function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);
+
+ /// Gets the artifact path from deployed code (aka. runtime code).
+ function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);
+
+ /// Returns the most recent broadcast for the given contract on `chainId` matching `txType`.
+ /// For example:
+ /// The most recent deployment can be fetched by passing `txType` as `CREATE` or `CREATE2`.
+ /// The most recent call can be fetched by passing `txType` as `CALL`.
+ function getBroadcast(string calldata contractName, uint64 chainId, BroadcastTxType txType)
+ external
+ view
+ returns (BroadcastTxSummary memory);
+
+ /// Returns all broadcasts for the given contract on `chainId` with the specified `txType`.
+ /// Sorted such that the most recent broadcast is the first element, and the oldest is the last. i.e descending order of BroadcastTxSummary.blockNumber.
+ function getBroadcasts(string calldata contractName, uint64 chainId, BroadcastTxType txType)
+ external
+ view
+ returns (BroadcastTxSummary[] memory);
+
+ /// Returns all broadcasts for the given contract on `chainId`.
+ /// Sorted such that the most recent broadcast is the first element, and the oldest is the last. i.e descending order of BroadcastTxSummary.blockNumber.
+ function getBroadcasts(string calldata contractName, uint64 chainId)
+ external
+ view
+ returns (BroadcastTxSummary[] memory);
+
+ /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);
+
+ /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);
+
+ /// Returns the most recent deployment for the current `chainId`.
+ function getDeployment(string calldata contractName) external view returns (address deployedAddress);
+
+ /// Returns the most recent deployment for the given contract on `chainId`
+ function getDeployment(string calldata contractName, uint64 chainId) external view returns (address deployedAddress);
+
+ /// Returns all deployments for the given contract on `chainId`
+ /// Sorted in descending order of deployment time i.e descending order of BroadcastTxSummary.blockNumber.
+ /// The most recent deployment is the first element, and the oldest is the last.
+ function getDeployments(string calldata contractName, uint64 chainId)
+ external
+ view
+ returns (address[] memory deployedAddresses);
+
+ /// Returns true if the path exists on disk and is pointing at a directory, else returns false.
+ function isDir(string calldata path) external view returns (bool result);
+
+ /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.
+ function isFile(string calldata path) external view returns (bool result);
+
+ /// Get the path of the current project root.
+ function projectRoot() external view returns (string memory path);
+
+ /// Prompts the user for a string value in the terminal.
+ function prompt(string calldata promptText) external returns (string memory input);
+
+ /// Prompts the user for an address in the terminal.
+ function promptAddress(string calldata promptText) external returns (address);
+
+ /// Prompts the user for a hidden string value in the terminal.
+ function promptSecret(string calldata promptText) external returns (string memory input);
+
+ /// Prompts the user for hidden uint256 in the terminal (usually pk).
+ function promptSecretUint(string calldata promptText) external returns (uint256);
+
+ /// Prompts the user for uint256 in the terminal.
+ function promptUint(string calldata promptText) external returns (uint256);
+
+ /// Reads the directory at the given path recursively, up to `maxDepth`.
+ /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.
+ /// Follows symbolic links if `followLinks` is true.
+ function readDir(string calldata path) external view returns (DirEntry[] memory entries);
+
+ /// See `readDir(string)`.
+ function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);
+
+ /// See `readDir(string)`.
+ function readDir(string calldata path, uint64 maxDepth, bool followLinks)
+ external
+ view
+ returns (DirEntry[] memory entries);
+
+ /// Reads the entire content of file to string. `path` is relative to the project root.
+ function readFile(string calldata path) external view returns (string memory data);
+
+ /// Reads the entire content of file as binary. `path` is relative to the project root.
+ function readFileBinary(string calldata path) external view returns (bytes memory data);
+
+ /// Reads next line of file to string.
+ function readLine(string calldata path) external view returns (string memory line);
+
+ /// Reads a symbolic link, returning the path that the link points to.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` is not a symbolic link.
+ /// - `path` does not exist.
+ function readLink(string calldata linkPath) external view returns (string memory targetPath);
+
+ /// Removes a directory at the provided path.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` doesn't exist.
+ /// - `path` isn't a directory.
+ /// - User lacks permissions to modify `path`.
+ /// - The directory is not empty and `recursive` is false.
+ /// `path` is relative to the project root.
+ function removeDir(string calldata path, bool recursive) external;
+
+ /// Removes a file from the filesystem.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` points to a directory.
+ /// - The file doesn't exist.
+ /// - The user lacks permissions to remove the file.
+ /// `path` is relative to the project root.
+ function removeFile(string calldata path) external;
+
+ /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.
+ function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);
+
+ /// Returns the time since unix epoch in milliseconds.
+ function unixTime() external view returns (uint256 milliseconds);
+
+ /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.
+ /// `path` is relative to the project root.
+ function writeFile(string calldata path, string calldata data) external;
+
+ /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.
+ /// `path` is relative to the project root.
+ function writeFileBinary(string calldata path, bytes calldata data) external;
+
+ /// Writes line to file, creating a file if it does not exist.
+ /// `path` is relative to the project root.
+ function writeLine(string calldata path, string calldata data) external;
+
+ // ======== JSON ========
+
+ /// Checks if `key` exists in a JSON object.
+ function keyExistsJson(string calldata json, string calldata key) external view returns (bool);
+
+ /// Parses a string of JSON data at `key` and coerces it to `address`.
+ function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);
+
+ /// Parses a string of JSON data at `key` and coerces it to `address[]`.
+ function parseJsonAddressArray(string calldata json, string calldata key) external pure returns (address[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bool`.
+ function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bool[]`.
+ function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes`.
+ function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes32`.
+ function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.
+ function parseJsonBytes32Array(string calldata json, string calldata key) external pure returns (bytes32[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.
+ function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `int256`.
+ function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);
+
+ /// Parses a string of JSON data at `key` and coerces it to `int256[]`.
+ function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);
+
+ /// Returns an array of all the keys in a JSON object.
+ function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);
+
+ /// Parses a string of JSON data at `key` and coerces it to `string`.
+ function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `string[]`.
+ function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.
+ function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.
+ function parseJsonType(string calldata json, string calldata typeDescription) external pure returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.
+ function parseJsonType(string calldata json, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `uint256`.
+ function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);
+
+ /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.
+ function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);
+
+ /// ABI-encodes a JSON object.
+ function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);
+
+ /// ABI-encodes a JSON object at `key`.
+ function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);
+
+ /// See `serializeJson`.
+ function serializeAddress(string calldata objectKey, string calldata valueKey, address value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBool(string calldata objectKey, string calldata valueKey, bool value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)
+ external
+ returns (string memory json);
+
+ /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.
+ /// Returns the stringified version of the specific JSON file up to that moment.
+ function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeJsonType(string calldata typeDescription, bytes calldata value)
+ external
+ pure
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeJsonType(
+ string calldata objectKey,
+ string calldata valueKey,
+ string calldata typeDescription,
+ bytes calldata value
+ ) external returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)
+ external
+ returns (string memory json);
+
+ /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.
+ function writeJson(string calldata json, string calldata path) external;
+
+ /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key =
+ /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.
+ /// This cheatcode will create new keys if they didn't previously exist.
+ function writeJson(string calldata json, string calldata path, string calldata valueKey) external;
+
+ /// Checks if `key` exists in a JSON object
+ /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.
+ function keyExists(string calldata json, string calldata key) external view returns (bool);
+
+ // ======== Scripting ========
+
+ /// Attach an EIP-4844 blob to the next call
+ function attachBlob(bytes calldata blob) external;
+
+ /// Designate the next call as an EIP-7702 transaction
+ function attachDelegation(SignedDelegation calldata signedDelegation) external;
+
+ /// Designate the next call as an EIP-7702 transaction, with optional cross-chain validity.
+ function attachDelegation(SignedDelegation calldata signedDelegation, bool crossChain) external;
+
+ /// Takes a signed transaction and broadcasts it to the network.
+ function broadcastRawTransaction(bytes calldata data) external;
+
+ /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.
+ /// Broadcasting address is determined by checking the following in order:
+ /// 1. If `--sender` argument was provided, that address is used.
+ /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.
+ /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.
+ function broadcast() external;
+
+ /// Has the next call (at this call depth only) create a transaction with the address provided
+ /// as the sender that can later be signed and sent onchain.
+ function broadcast(address signer) external;
+
+ /// Has the next call (at this call depth only) create a transaction with the private key
+ /// provided as the sender that can later be signed and sent onchain.
+ function broadcast(uint256 privateKey) external;
+
+ /// Returns addresses of available unlocked wallets in the script environment.
+ function getWallets() external view returns (address[] memory wallets);
+
+ /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction
+ function signAndAttachDelegation(address implementation, uint256 privateKey)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction for specific nonce
+ function signAndAttachDelegation(address implementation, uint256 privateKey, uint64 nonce)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction, with optional cross-chain validity.
+ function signAndAttachDelegation(address implementation, uint256 privateKey, bool crossChain)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization for delegation
+ function signDelegation(address implementation, uint256 privateKey)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization for delegation for specific nonce
+ function signDelegation(address implementation, uint256 privateKey, uint64 nonce)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization for delegation, with optional cross-chain validity.
+ function signDelegation(address implementation, uint256 privateKey, bool crossChain)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.
+ /// Broadcasting address is determined by checking the following in order:
+ /// 1. If `--sender` argument was provided, that address is used.
+ /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.
+ /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.
+ function startBroadcast() external;
+
+ /// Has all subsequent calls (at this call depth only) create transactions with the address
+ /// provided that can later be signed and sent onchain.
+ function startBroadcast(address signer) external;
+
+ /// Has all subsequent calls (at this call depth only) create transactions with the private key
+ /// provided that can later be signed and sent onchain.
+ function startBroadcast(uint256 privateKey) external;
+
+ /// Stops collecting onchain transactions.
+ function stopBroadcast() external;
+
+ // ======== String ========
+
+ /// Returns true if `search` is found in `subject`, false otherwise.
+ function contains(string calldata subject, string calldata search) external pure returns (bool result);
+
+ /// Returns the index of the first occurrence of a `key` in an `input` string.
+ /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.
+ /// Returns 0 in case of an empty `key`.
+ function indexOf(string calldata input, string calldata key) external pure returns (uint256);
+
+ /// Parses the given `string` into an `address`.
+ function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);
+
+ /// Parses the given `string` into a `bool`.
+ function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);
+
+ /// Parses the given `string` into `bytes`.
+ function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);
+
+ /// Parses the given `string` into a `bytes32`.
+ function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);
+
+ /// Parses the given `string` into a `int256`.
+ function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);
+
+ /// Parses the given `string` into a `uint256`.
+ function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);
+
+ /// Replaces occurrences of `from` in the given `string` with `to`.
+ function replace(string calldata input, string calldata from, string calldata to)
+ external
+ pure
+ returns (string memory output);
+
+ /// Splits the given `string` into an array of strings divided by the `delimiter`.
+ function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);
+
+ /// Converts the given `string` value to Lowercase.
+ function toLowercase(string calldata input) external pure returns (string memory output);
+
+ /// Converts the given value to a `string`.
+ function toString(address value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bytes calldata value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bytes32 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bool value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(uint256 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(int256 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given `string` value to Uppercase.
+ function toUppercase(string calldata input) external pure returns (string memory output);
+
+ /// Trims leading and trailing whitespace from the given `string` value.
+ function trim(string calldata input) external pure returns (string memory output);
+
+ // ======== Testing ========
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message.
+ function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqAbsDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message.
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqAbsDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Includes error message into revert string on failure.
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Includes error message into revert string on failure.
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message.
+ function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals)
+ external
+ pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message.
+ function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals)
+ external
+ pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Includes error message into revert string on failure.
+ function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error)
+ external
+ pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Includes error message into revert string on failure.
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `bool` values are equal.
+ function assertEq(bool left, bool right) external pure;
+
+ /// Asserts that two `bool` values are equal and includes error message into revert string on failure.
+ function assertEq(bool left, bool right, string calldata error) external pure;
+
+ /// Asserts that two `string` values are equal.
+ function assertEq(string calldata left, string calldata right) external pure;
+
+ /// Asserts that two `string` values are equal and includes error message into revert string on failure.
+ function assertEq(string calldata left, string calldata right, string calldata error) external pure;
+
+ /// Asserts that two `bytes` values are equal.
+ function assertEq(bytes calldata left, bytes calldata right) external pure;
+
+ /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bool` values are equal.
+ function assertEq(bool[] calldata left, bool[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.
+ function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `uint256 values are equal.
+ function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.
+ function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `int256` values are equal.
+ function assertEq(int256[] calldata left, int256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.
+ function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are equal.
+ function assertEq(uint256 left, uint256 right) external pure;
+
+ /// Asserts that two arrays of `address` values are equal.
+ function assertEq(address[] calldata left, address[] calldata right) external pure;
+
+ /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.
+ function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are equal.
+ function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `string` values are equal.
+ function assertEq(string[] calldata left, string[] calldata right) external pure;
+
+ /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.
+ function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes` values are equal.
+ function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.
+ function assertEq(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are equal.
+ function assertEq(int256 left, int256 right) external pure;
+
+ /// Asserts that two `int256` values are equal and includes error message into revert string on failure.
+ function assertEq(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `address` values are equal.
+ function assertEq(address left, address right) external pure;
+
+ /// Asserts that two `address` values are equal and includes error message into revert string on failure.
+ function assertEq(address left, address right, string calldata error) external pure;
+
+ /// Asserts that two `bytes32` values are equal.
+ function assertEq(bytes32 left, bytes32 right) external pure;
+
+ /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;
+
+ /// Asserts that the given condition is false.
+ function assertFalse(bool condition) external pure;
+
+ /// Asserts that the given condition is false and includes error message into revert string on failure.
+ function assertFalse(bool condition, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ function assertGe(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertGe(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ function assertGe(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertGe(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message.
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message.
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ function assertGt(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Includes error message into revert string on failure.
+ function assertGt(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ function assertGt(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Includes error message into revert string on failure.
+ function assertGt(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ function assertLe(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertLe(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ function assertLe(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertLe(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message.
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message.
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ function assertLt(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Includes error message into revert string on failure.
+ function assertLt(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ function assertLt(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Includes error message into revert string on failure.
+ function assertLt(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `bool` values are not equal.
+ function assertNotEq(bool left, bool right) external pure;
+
+ /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bool left, bool right, string calldata error) external pure;
+
+ /// Asserts that two `string` values are not equal.
+ function assertNotEq(string calldata left, string calldata right) external pure;
+
+ /// Asserts that two `string` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;
+
+ /// Asserts that two `bytes` values are not equal.
+ function assertNotEq(bytes calldata left, bytes calldata right) external pure;
+
+ /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bool` values are not equal.
+ function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `uint256` values are not equal.
+ function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `int256` values are not equal.
+ function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal.
+ function assertNotEq(uint256 left, uint256 right) external pure;
+
+ /// Asserts that two arrays of `address` values are not equal.
+ function assertNotEq(address[] calldata left, address[] calldata right) external pure;
+
+ /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are not equal.
+ function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `string` values are not equal.
+ function assertNotEq(string[] calldata left, string[] calldata right) external pure;
+
+ /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes` values are not equal.
+ function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are not equal.
+ function assertNotEq(int256 left, int256 right) external pure;
+
+ /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `address` values are not equal.
+ function assertNotEq(address left, address right) external pure;
+
+ /// Asserts that two `address` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(address left, address right, string calldata error) external pure;
+
+ /// Asserts that two `bytes32` values are not equal.
+ function assertNotEq(bytes32 left, bytes32 right) external pure;
+
+ /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;
+
+ /// Asserts that the given condition is true.
+ function assertTrue(bool condition) external pure;
+
+ /// Asserts that the given condition is true and includes error message into revert string on failure.
+ function assertTrue(bool condition, string calldata error) external pure;
+
+ /// If the condition is false, discard this run's fuzz inputs and generate new ones.
+ function assume(bool condition) external pure;
+
+ /// Discard this run's fuzz inputs and generate new ones if next call reverted.
+ function assumeNoRevert() external pure;
+
+ /// Discard this run's fuzz inputs and generate new ones if next call reverts with the potential revert parameters.
+ function assumeNoRevert(PotentialRevert calldata potentialRevert) external pure;
+
+ /// Discard this run's fuzz inputs and generate new ones if next call reverts with the any of the potential revert parameters.
+ function assumeNoRevert(PotentialRevert[] calldata potentialReverts) external pure;
+
+ /// Writes a breakpoint to jump to in the debugger.
+ function breakpoint(string calldata char) external pure;
+
+ /// Writes a conditional breakpoint to jump to in the debugger.
+ function breakpoint(string calldata char, bool value) external pure;
+
+ /// Returns true if the current Foundry version is greater than or equal to the given version.
+ /// The given version string must be in the format `major.minor.patch`.
+ /// This is equivalent to `foundryVersionCmp(version) >= 0`.
+ function foundryVersionAtLeast(string calldata version) external view returns (bool);
+
+ /// Compares the current Foundry version with the given version string.
+ /// The given version string must be in the format `major.minor.patch`.
+ /// Returns:
+ /// -1 if current Foundry version is less than the given version
+ /// 0 if current Foundry version equals the given version
+ /// 1 if current Foundry version is greater than the given version
+ /// This result can then be used with a comparison operator against `0`.
+ /// For example, to check if the current Foundry version is greater than or equal to `1.0.0`:
+ /// `if (foundryVersionCmp("1.0.0") >= 0) { ... }`
+ function foundryVersionCmp(string calldata version) external view returns (int256);
+
+ /// Returns a Chain struct for specific alias
+ function getChain(string calldata chainAlias) external view returns (Chain memory chain);
+
+ /// Returns a Chain struct for specific chainId
+ function getChain(uint256 chainId) external view returns (Chain memory chain);
+
+ /// Returns the Foundry version.
+ /// Format: -+..
+ /// Sample output: 0.3.0-nightly+3cb96bde9b.1737036656.debug
+ /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.
+ /// For reliable version comparisons, use UNIX format (e.g., >= 1700000000)
+ /// to compare timestamps while ignoring minor time differences.
+ function getFoundryVersion() external view returns (string memory version);
+
+ /// Returns the RPC url for the given alias.
+ function rpcUrl(string calldata rpcAlias) external view returns (string memory json);
+
+ /// Returns all rpc urls and their aliases as structs.
+ function rpcUrlStructs() external view returns (Rpc[] memory urls);
+
+ /// Returns all rpc urls and their aliases `[alias, url][]`.
+ function rpcUrls() external view returns (string[2][] memory urls);
+
+ /// Suspends execution of the main thread for `duration` milliseconds.
+ function sleep(uint256 duration) external;
+
+ // ======== Toml ========
+
+ /// Checks if `key` exists in a TOML table.
+ function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);
+
+ /// Parses a string of TOML data at `key` and coerces it to `address`.
+ function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);
+
+ /// Parses a string of TOML data at `key` and coerces it to `address[]`.
+ function parseTomlAddressArray(string calldata toml, string calldata key) external pure returns (address[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bool`.
+ function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bool[]`.
+ function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes`.
+ function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes32`.
+ function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.
+ function parseTomlBytes32Array(string calldata toml, string calldata key) external pure returns (bytes32[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.
+ function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `int256`.
+ function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);
+
+ /// Parses a string of TOML data at `key` and coerces it to `int256[]`.
+ function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);
+
+ /// Returns an array of all the keys in a TOML table.
+ function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);
+
+ /// Parses a string of TOML data at `key` and coerces it to `string`.
+ function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `string[]`.
+ function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.
+ function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.
+ function parseTomlType(string calldata toml, string calldata typeDescription) external pure returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.
+ function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `uint256`.
+ function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);
+
+ /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.
+ function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);
+
+ /// ABI-encodes a TOML table.
+ function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);
+
+ /// ABI-encodes a TOML table at `key`.
+ function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);
+
+ /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.
+ function writeToml(string calldata json, string calldata path) external;
+
+ /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key =
+ /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.
+ /// This cheatcode will create new keys if they didn't previously exist.
+ function writeToml(string calldata json, string calldata path, string calldata valueKey) external;
+
+ // ======== Utilities ========
+
+ /// Returns an uint256 value bounded in given range and different from the current one.
+ function bound(uint256 current, uint256 min, uint256 max) external view returns (uint256);
+
+ /// Returns an int256 value bounded in given range and different from the current one.
+ function bound(int256 current, int256 min, int256 max) external view returns (int256);
+
+ /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer) external pure returns (address);
+
+ /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);
+
+ /// Compute the address a contract will be deployed at for a given deployer address and nonce.
+ function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);
+
+ /// Utility cheatcode to copy storage of `from` contract to another `to` contract.
+ function copyStorage(address from, address to) external;
+
+ /// Generates the struct hash of the canonical EIP-712 type representation and its abi-encoded data.
+ /// Supports 2 different inputs:
+ /// 1. Name of the type (i.e. "PermitSingle"):
+ /// * requires previous binding generation with `forge bind-json`.
+ /// * bindings will be retrieved from the path configured in `foundry.toml`.
+ /// 2. String representation of the type (i.e. "Foo(Bar bar) Bar(uint256 baz)").
+ /// * Note: the cheatcode will use the canonical type even if the input is malformated
+ /// with the wrong order of elements or with extra whitespaces.
+ function eip712HashStruct(string calldata typeNameOrDefinition, bytes calldata abiEncodedData)
+ external
+ pure
+ returns (bytes32 typeHash);
+
+ /// Generates the struct hash of the canonical EIP-712 type representation and its abi-encoded data.
+ /// Requires previous binding generation with `forge bind-json`.
+ /// Params:
+ /// * `bindingsPath`: path where the output of `forge bind-json` is stored.
+ /// * `typeName`: Name of the type (i.e. "PermitSingle").
+ /// * `abiEncodedData`: ABI-encoded data for the struct that is being hashed.
+ function eip712HashStruct(string calldata bindingsPath, string calldata typeName, bytes calldata abiEncodedData)
+ external
+ pure
+ returns (bytes32 typeHash);
+
+ /// Generates the hash of the canonical EIP-712 type representation.
+ /// Supports 2 different inputs:
+ /// 1. Name of the type (i.e. "Transaction"):
+ /// * requires previous binding generation with `forge bind-json`.
+ /// * bindings will be retrieved from the path configured in `foundry.toml`.
+ /// 2. String representation of the type (i.e. "Foo(Bar bar) Bar(uint256 baz)").
+ /// * Note: the cheatcode will output the canonical type even if the input is malformated
+ /// with the wrong order of elements or with extra whitespaces.
+ function eip712HashType(string calldata typeNameOrDefinition) external pure returns (bytes32 typeHash);
+
+ /// Generates the hash of the canonical EIP-712 type representation.
+ /// Requires previous binding generation with `forge bind-json`.
+ /// Params:
+ /// * `bindingsPath`: path where the output of `forge bind-json` is stored.
+ /// * `typeName`: Name of the type (i.e. "Transaction").
+ function eip712HashType(string calldata bindingsPath, string calldata typeName)
+ external
+ pure
+ returns (bytes32 typeHash);
+
+ /// Generates a ready-to-sign digest of human-readable typed data following the EIP-712 standard.
+ function eip712HashTypedData(string calldata jsonData) external pure returns (bytes32 digest);
+
+ /// Returns ENS namehash for provided string.
+ function ensNamehash(string calldata name) external pure returns (bytes32);
+
+ /// RLP decodes an RLP payload into a list of bytes.
+ function fromRlp(bytes calldata rlp) external pure returns (bytes[] memory data);
+
+ /// Gets the label for the specified address.
+ function getLabel(address account) external view returns (string memory currentLabel);
+
+ /// Labels an address in call traces.
+ function label(address account, string calldata newLabel) external;
+
+ /// Pauses collection of call traces. Useful in cases when you want to skip tracing of
+ /// complex calls which are not useful for debugging.
+ function pauseTracing() external view;
+
+ /// Returns a random `address`.
+ function randomAddress() external view returns (address);
+
+ /// Returns a random `bool`.
+ function randomBool() external view returns (bool);
+
+ /// Returns a random byte array value of the given length.
+ function randomBytes(uint256 len) external view returns (bytes memory);
+
+ /// Returns a random fixed-size byte array of length 4.
+ function randomBytes4() external view returns (bytes4);
+
+ /// Returns a random fixed-size byte array of length 8.
+ function randomBytes8() external view returns (bytes8);
+
+ /// Returns a random `int256` value.
+ function randomInt() external view returns (int256);
+
+ /// Returns a random `int256` value of given bits.
+ function randomInt(uint256 bits) external view returns (int256);
+
+ /// Returns a random uint256 value.
+ function randomUint() external view returns (uint256);
+
+ /// Returns random uint256 value between the provided range (=min..=max).
+ function randomUint(uint256 min, uint256 max) external view returns (uint256);
+
+ /// Returns a random `uint256` value of given bits.
+ function randomUint(uint256 bits) external view returns (uint256);
+
+ /// Unpauses collection of call traces.
+ function resumeTracing() external view;
+
+ /// Utility cheatcode to set arbitrary storage for given target address.
+ function setArbitraryStorage(address target) external;
+
+ /// Utility cheatcode to set arbitrary storage for given target address and overwrite
+ /// any storage slots that have been previously set.
+ function setArbitraryStorage(address target, bool overwrite) external;
+
+ /// Set RNG seed.
+ function setSeed(uint256 seed) external;
+
+ /// Randomly shuffles an array.
+ function shuffle(uint256[] calldata array) external returns (uint256[] memory);
+
+ /// Sorts an array in ascending order.
+ function sort(uint256[] calldata array) external returns (uint256[] memory);
+
+ /// Encodes a `bytes` value to a base64url string.
+ function toBase64URL(bytes calldata data) external pure returns (string memory);
+
+ /// Encodes a `string` value to a base64url string.
+ function toBase64URL(string calldata data) external pure returns (string memory);
+
+ /// Encodes a `bytes` value to a base64 string.
+ function toBase64(bytes calldata data) external pure returns (string memory);
+
+ /// Encodes a `string` value to a base64 string.
+ function toBase64(string calldata data) external pure returns (string memory);
+
+ /// RLP encodes a list of bytes into an RLP payload.
+ function toRlp(bytes[] calldata data) external pure returns (bytes memory);
+}
+
+/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used
+/// in tests, but it is not recommended to use these cheats in scripts.
+interface Vm is VmSafe {
+ // ======== EVM ========
+
+ /// Utility cheatcode to set an EIP-2930 access list for all subsequent transactions.
+ function accessList(AccessListItem[] calldata access) external;
+
+ /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.
+ function activeFork() external view returns (uint256 forkId);
+
+ /// In forking mode, explicitly grant the given address cheatcode access.
+ function allowCheatcodes(address account) external;
+
+ /// Sets `block.blobbasefee`
+ function blobBaseFee(uint256 newBlobBaseFee) external;
+
+ /// Sets the blobhashes in the transaction.
+ /// Not available on EVM versions before Cancun.
+ /// If used on unsupported EVM versions it will revert.
+ function blobhashes(bytes32[] calldata hashes) external;
+
+ /// Sets `block.chainid`.
+ function chainId(uint256 newChainId) external;
+
+ /// Clears all mocked calls.
+ function clearMockedCalls() external;
+
+ /// Clones a source account code, state, balance and nonce to a target account and updates in-memory EVM state.
+ function cloneAccount(address source, address target) external;
+
+ /// Sets `block.coinbase`.
+ function coinbase(address newCoinbase) external;
+
+ /// Marks the slots of an account and the account address as cold.
+ function cool(address target) external;
+
+ /// Utility cheatcode to mark specific storage slot as cold, simulating no prior read.
+ function coolSlot(address target, bytes32 slot) external;
+
+ /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias) external returns (uint256 forkId);
+
+ /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
+
+ /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,
+ /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
+
+ /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);
+
+ /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
+
+ /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,
+ /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
+
+ /// Sets an address' balance.
+ function deal(address account, uint256 newBalance) external;
+
+ /// Removes the snapshot with the given ID created by `snapshot`.
+ /// Takes the snapshot ID to delete.
+ /// Returns `true` if the snapshot was successfully deleted.
+ /// Returns `false` if the snapshot does not exist.
+ function deleteStateSnapshot(uint256 snapshotId) external returns (bool success);
+
+ /// Removes _all_ snapshots previously created by `snapshot`.
+ function deleteStateSnapshots() external;
+
+ /// Sets `block.difficulty`.
+ /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.
+ /// Reverts if used on unsupported EVM versions.
+ function difficulty(uint256 newDifficulty) external;
+
+ /// Dump a genesis JSON file's `allocs` to disk.
+ function dumpState(string calldata pathToStateJson) external;
+
+ /// Sets an address' code.
+ function etch(address target, bytes calldata newRuntimeBytecode) external;
+
+ /// Sets `block.basefee`.
+ function fee(uint256 newBasefee) external;
+
+ /// Gets the blockhashes from the current transaction.
+ /// Not available on EVM versions before Cancun.
+ /// If used on unsupported EVM versions it will revert.
+ function getBlobhashes() external view returns (bytes32[] memory hashes);
+
+ /// Returns true if the account is marked as persistent.
+ function isPersistent(address account) external view returns (bool persistent);
+
+ /// Load a genesis JSON file's `allocs` into the in-memory EVM state.
+ function loadAllocs(string calldata pathToAllocsJson) external;
+
+ /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup
+ /// Meaning, changes made to the state of this account will be kept when switching forks.
+ function makePersistent(address account) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address account0, address account1) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address account0, address account1, address account2) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address[] calldata accounts) external;
+
+ /// Reverts a call to an address with specified revert data.
+ function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;
+
+ /// Reverts a call to an address with a specific `msg.value`, with specified revert data.
+ function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData) external;
+
+ /// Reverts a call to an address with specified revert data.
+ /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
+ function mockCallRevert(address callee, bytes4 data, bytes calldata revertData) external;
+
+ /// Reverts a call to an address with a specific `msg.value`, with specified revert data.
+ /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
+ function mockCallRevert(address callee, uint256 msgValue, bytes4 data, bytes calldata revertData) external;
+
+ /// Mocks a call to an address, returning specified data.
+ /// Calldata can either be strict or a partial match, e.g. if you only
+ /// pass a Solidity selector to the expected calldata, then the entire Solidity
+ /// function will be mocked.
+ function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;
+
+ /// Mocks a call to an address with a specific `msg.value`, returning specified data.
+ /// Calldata match takes precedence over `msg.value` in case of ambiguity.
+ function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;
+
+ /// Mocks a call to an address, returning specified data.
+ /// Calldata can either be strict or a partial match, e.g. if you only
+ /// pass a Solidity selector to the expected calldata, then the entire Solidity
+ /// function will be mocked.
+ /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
+ function mockCall(address callee, bytes4 data, bytes calldata returnData) external;
+
+ /// Mocks a call to an address with a specific `msg.value`, returning specified data.
+ /// Calldata match takes precedence over `msg.value` in case of ambiguity.
+ /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
+ function mockCall(address callee, uint256 msgValue, bytes4 data, bytes calldata returnData) external;
+
+ /// Mocks multiple calls to an address, returning specified data for each call.
+ function mockCalls(address callee, bytes calldata data, bytes[] calldata returnData) external;
+
+ /// Mocks multiple calls to an address with a specific `msg.value`, returning specified data for each call.
+ function mockCalls(address callee, uint256 msgValue, bytes calldata data, bytes[] calldata returnData) external;
+
+ /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls
+ /// `target` with the same calldata. This functionality is similar to a delegate call made to
+ /// `target` contract from `callee`.
+ /// Can be used to substitute a call to a function with another implementation that captures
+ /// the primary logic of the original function but is easier to reason about.
+ /// If calldata is not a strict match then partial match by selector is attempted.
+ function mockFunction(address callee, address target, bytes calldata data) external;
+
+ /// Utility cheatcode to remove any EIP-2930 access list set by `accessList` cheatcode.
+ function noAccessList() external;
+
+ /// Sets the *next* call's `msg.sender` to be the input address.
+ function prank(address msgSender) external;
+
+ /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.
+ function prank(address msgSender, address txOrigin) external;
+
+ /// Sets the *next* delegate call's `msg.sender` to be the input address.
+ function prank(address msgSender, bool delegateCall) external;
+
+ /// Sets the *next* delegate call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.
+ function prank(address msgSender, address txOrigin, bool delegateCall) external;
+
+ /// Sets `block.prevrandao`.
+ /// Not available on EVM versions before Paris. Use `difficulty` instead.
+ /// If used on unsupported EVM versions it will revert.
+ function prevrandao(bytes32 newPrevrandao) external;
+
+ /// Sets `block.prevrandao`.
+ /// Not available on EVM versions before Paris. Use `difficulty` instead.
+ /// If used on unsupported EVM versions it will revert.
+ function prevrandao(uint256 newPrevrandao) external;
+
+ /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.
+ function readCallers() external view returns (CallerMode callerMode, address msgSender, address txOrigin);
+
+ /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.
+ function resetNonce(address account) external;
+
+ /// Revert the state of the EVM to a previous snapshot
+ /// Takes the snapshot ID to revert to.
+ /// Returns `true` if the snapshot was successfully reverted.
+ /// Returns `false` if the snapshot does not exist.
+ /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteStateSnapshot`.
+ function revertToState(uint256 snapshotId) external returns (bool success);
+
+ /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots
+ /// Takes the snapshot ID to revert to.
+ /// Returns `true` if the snapshot was successfully reverted and deleted.
+ /// Returns `false` if the snapshot does not exist.
+ function revertToStateAndDelete(uint256 snapshotId) external returns (bool success);
+
+ /// Revokes persistent status from the address, previously added via `makePersistent`.
+ function revokePersistent(address account) external;
+
+ /// See `revokePersistent(address)`.
+ function revokePersistent(address[] calldata accounts) external;
+
+ /// Sets `block.height`.
+ function roll(uint256 newHeight) external;
+
+ /// Updates the currently active fork to given block number
+ /// This is similar to `roll` but for the currently active fork.
+ function rollFork(uint256 blockNumber) external;
+
+ /// Updates the currently active fork to given transaction. This will `rollFork` with the number
+ /// of the block the transaction was mined in and replays all transaction mined before it in the block.
+ function rollFork(bytes32 txHash) external;
+
+ /// Updates the given fork to given block number.
+ function rollFork(uint256 forkId, uint256 blockNumber) external;
+
+ /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.
+ function rollFork(uint256 forkId, bytes32 txHash) external;
+
+ /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.
+ function selectFork(uint256 forkId) external;
+
+ /// Set blockhash for the current block.
+ /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.
+ function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;
+
+ /// Sets the nonce of an account. Must be higher than the current nonce of the account.
+ function setNonce(address account, uint64 newNonce) external;
+
+ /// Sets the nonce of an account to an arbitrary value.
+ function setNonceUnsafe(address account, uint64 newNonce) external;
+
+ /// Snapshot capture the gas usage of the last call by name from the callee perspective.
+ function snapshotGasLastCall(string calldata name) external returns (uint256 gasUsed);
+
+ /// Snapshot capture the gas usage of the last call by name in a group from the callee perspective.
+ function snapshotGasLastCall(string calldata group, string calldata name) external returns (uint256 gasUsed);
+
+ /// Snapshot the current state of the evm.
+ /// Returns the ID of the snapshot that was created.
+ /// To revert a snapshot use `revertToState`.
+ function snapshotState() external returns (uint256 snapshotId);
+
+ /// Snapshot capture an arbitrary numerical value by name.
+ /// The group name is derived from the contract name.
+ function snapshotValue(string calldata name, uint256 value) external;
+
+ /// Snapshot capture an arbitrary numerical value by name in a group.
+ function snapshotValue(string calldata group, string calldata name, uint256 value) external;
+
+ /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.
+ function startPrank(address msgSender) external;
+
+ /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.
+ function startPrank(address msgSender, address txOrigin) external;
+
+ /// Sets all subsequent delegate calls' `msg.sender` to be the input address until `stopPrank` is called.
+ function startPrank(address msgSender, bool delegateCall) external;
+
+ /// Sets all subsequent delegate calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.
+ function startPrank(address msgSender, address txOrigin, bool delegateCall) external;
+
+ /// Start a snapshot capture of the current gas usage by name.
+ /// The group name is derived from the contract name.
+ function startSnapshotGas(string calldata name) external;
+
+ /// Start a snapshot capture of the current gas usage by name in a group.
+ function startSnapshotGas(string calldata group, string calldata name) external;
+
+ /// Resets subsequent calls' `msg.sender` to be `address(this)`.
+ function stopPrank() external;
+
+ /// Stop the snapshot capture of the current gas by latest snapshot name, capturing the gas used since the start.
+ function stopSnapshotGas() external returns (uint256 gasUsed);
+
+ /// Stop the snapshot capture of the current gas usage by name, capturing the gas used since the start.
+ /// The group name is derived from the contract name.
+ function stopSnapshotGas(string calldata name) external returns (uint256 gasUsed);
+
+ /// Stop the snapshot capture of the current gas usage by name in a group, capturing the gas used since the start.
+ function stopSnapshotGas(string calldata group, string calldata name) external returns (uint256 gasUsed);
+
+ /// Stores a value to an address' storage slot.
+ function store(address target, bytes32 slot, bytes32 value) external;
+
+ /// Fetches the given transaction from the active fork and executes it on the current state.
+ function transact(bytes32 txHash) external;
+
+ /// Fetches the given transaction from the given fork and executes it on the current state.
+ function transact(uint256 forkId, bytes32 txHash) external;
+
+ /// Sets `tx.gasprice`.
+ function txGasPrice(uint256 newGasPrice) external;
+
+ /// Utility cheatcode to mark specific storage slot as warm, simulating a prior read.
+ function warmSlot(address target, bytes32 slot) external;
+
+ /// Sets `block.timestamp`.
+ function warp(uint256 newTimestamp) external;
+
+ /// `deleteSnapshot` is being deprecated in favor of `deleteStateSnapshot`. It will be removed in future versions.
+ function deleteSnapshot(uint256 snapshotId) external returns (bool success);
+
+ /// `deleteSnapshots` is being deprecated in favor of `deleteStateSnapshots`. It will be removed in future versions.
+ function deleteSnapshots() external;
+
+ /// `revertToAndDelete` is being deprecated in favor of `revertToStateAndDelete`. It will be removed in future versions.
+ function revertToAndDelete(uint256 snapshotId) external returns (bool success);
+
+ /// `revertTo` is being deprecated in favor of `revertToState`. It will be removed in future versions.
+ function revertTo(uint256 snapshotId) external returns (bool success);
+
+ /// `snapshot` is being deprecated in favor of `snapshotState`. It will be removed in future versions.
+ function snapshot() external returns (uint256 snapshotId);
+
+ // ======== Testing ========
+
+ /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.
+ function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;
+
+ /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.
+ function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)
+ external;
+
+ /// Expects a call to an address with the specified calldata.
+ /// Calldata can either be a strict or a partial match.
+ function expectCall(address callee, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified calldata.
+ function expectCall(address callee, bytes calldata data, uint64 count) external;
+
+ /// Expects a call to an address with the specified `msg.value` and calldata.
+ function expectCall(address callee, uint256 msgValue, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified `msg.value` and calldata.
+ function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;
+
+ /// Expect a call to an address with the specified `msg.value`, gas, and calldata.
+ function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.
+ function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;
+
+ /// Expects the deployment of the specified bytecode by the specified address using the CREATE opcode
+ function expectCreate(bytes calldata bytecode, address deployer) external;
+
+ /// Expects the deployment of the specified bytecode by the specified address using the CREATE2 opcode
+ function expectCreate2(bytes calldata bytecode, address deployer) external;
+
+ /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).
+ /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
+ function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData)
+ external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmitAnonymous(
+ bool checkTopic0,
+ bool checkTopic1,
+ bool checkTopic2,
+ bool checkTopic3,
+ bool checkData,
+ address emitter
+ ) external;
+
+ /// Prepare an expected anonymous log with all topic and data checks enabled.
+ /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data.
+ function expectEmitAnonymous() external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmitAnonymous(address emitter) external;
+
+ /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).
+ /// Call this function, then emit an event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) external;
+
+ /// Prepare an expected log with all topic and data checks enabled.
+ /// Call this function, then emit an event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data.
+ function expectEmit() external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmit(address emitter) external;
+
+ /// Expect a given number of logs with the provided topics.
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, uint64 count) external;
+
+ /// Expect a given number of logs from a specific emitter with the provided topics.
+ function expectEmit(
+ bool checkTopic1,
+ bool checkTopic2,
+ bool checkTopic3,
+ bool checkData,
+ address emitter,
+ uint64 count
+ ) external;
+
+ /// Expect a given number of logs with all topic and data checks enabled.
+ function expectEmit(uint64 count) external;
+
+ /// Expect a given number of logs from a specific emitter with all topic and data checks enabled.
+ function expectEmit(address emitter, uint64 count) external;
+
+ /// Expects an error on next call that starts with the revert data.
+ function expectPartialRevert(bytes4 revertData) external;
+
+ /// Expects an error on next call to reverter address, that starts with the revert data.
+ function expectPartialRevert(bytes4 revertData, address reverter) external;
+
+ /// Expects an error on next call with any revert data.
+ function expectRevert() external;
+
+ /// Expects an error on next call that exactly matches the revert data.
+ function expectRevert(bytes4 revertData) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls from the reverter address that match the revert data.
+ function expectRevert(bytes4 revertData, address reverter, uint64 count) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls from the reverter address that exactly match the revert data.
+ function expectRevert(bytes calldata revertData, address reverter, uint64 count) external;
+
+ /// Expects an error on next call that exactly matches the revert data.
+ function expectRevert(bytes calldata revertData) external;
+
+ /// Expects an error with any revert data on next call to reverter address.
+ function expectRevert(address reverter) external;
+
+ /// Expects an error from reverter address on next call, with any revert data.
+ function expectRevert(bytes4 revertData, address reverter) external;
+
+ /// Expects an error from reverter address on next call, that exactly matches the revert data.
+ function expectRevert(bytes calldata revertData, address reverter) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls with any revert data or reverter.
+ function expectRevert(uint64 count) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls that match the revert data.
+ function expectRevert(bytes4 revertData, uint64 count) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls that exactly match the revert data.
+ function expectRevert(bytes calldata revertData, uint64 count) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls from the reverter address.
+ function expectRevert(address reverter, uint64 count) external;
+
+ /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other
+ /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.
+ function expectSafeMemory(uint64 min, uint64 max) external;
+
+ /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.
+ /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges
+ /// to the set.
+ function expectSafeMemoryCall(uint64 min, uint64 max) external;
+
+ /// Marks a test as skipped. Must be called at the top level of a test.
+ function skip(bool skipTest) external;
+
+ /// Marks a test as skipped with a reason. Must be called at the top level of a test.
+ function skip(bool skipTest, string calldata reason) external;
+
+ /// Stops all safe memory expectation in the current subcontext.
+ function stopExpectSafeMemory() external;
+
+ // ======== Utilities ========
+
+ /// Causes the next contract creation (via new) to fail and return its initcode in the returndata buffer.
+ /// This allows type-safe access to the initcode payload that would be used for contract creation.
+ /// Example usage:
+ /// vm.interceptInitcode();
+ /// bytes memory initcode;
+ /// try new MyContract(param1, param2) { assert(false); }
+ /// catch (bytes memory interceptedInitcode) { initcode = interceptedInitcode; }
+ function interceptInitcode() external;
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/console.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/console.sol
new file mode 100644
index 000000000..88acdc8eb
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/console.sol
@@ -0,0 +1,1551 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+library console {
+ address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
+
+ function _sendLogPayloadImplementation(bytes memory payload) internal view {
+ address consoleAddress = CONSOLE_ADDRESS;
+ assembly ("memory-safe") {
+ pop(staticcall(gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0))
+ }
+ }
+
+ function _castToPure(function(bytes memory) internal view fnIn)
+ internal
+ pure
+ returns (function(bytes memory) pure fnOut)
+ {
+ assembly {
+ fnOut := fnIn
+ }
+ }
+
+ function _sendLogPayload(bytes memory payload) internal pure {
+ _castToPure(_sendLogPayloadImplementation)(payload);
+ }
+
+ function log() internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log()"));
+ }
+
+ function logInt(int256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
+ }
+
+ function logUint(uint256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
+ }
+
+ function logString(string memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function logBool(bool p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function logAddress(address p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function logBytes(bytes memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
+ }
+
+ function logBytes1(bytes1 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
+ }
+
+ function logBytes2(bytes2 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
+ }
+
+ function logBytes3(bytes3 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
+ }
+
+ function logBytes4(bytes4 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
+ }
+
+ function logBytes5(bytes5 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
+ }
+
+ function logBytes6(bytes6 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
+ }
+
+ function logBytes7(bytes7 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
+ }
+
+ function logBytes8(bytes8 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
+ }
+
+ function logBytes9(bytes9 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
+ }
+
+ function logBytes10(bytes10 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
+ }
+
+ function logBytes11(bytes11 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
+ }
+
+ function logBytes12(bytes12 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
+ }
+
+ function logBytes13(bytes13 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
+ }
+
+ function logBytes14(bytes14 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
+ }
+
+ function logBytes15(bytes15 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
+ }
+
+ function logBytes16(bytes16 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
+ }
+
+ function logBytes17(bytes17 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
+ }
+
+ function logBytes18(bytes18 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
+ }
+
+ function logBytes19(bytes19 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
+ }
+
+ function logBytes20(bytes20 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
+ }
+
+ function logBytes21(bytes21 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
+ }
+
+ function logBytes22(bytes22 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
+ }
+
+ function logBytes23(bytes23 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
+ }
+
+ function logBytes24(bytes24 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
+ }
+
+ function logBytes25(bytes25 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
+ }
+
+ function logBytes26(bytes26 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
+ }
+
+ function logBytes27(bytes27 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
+ }
+
+ function logBytes28(bytes28 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
+ }
+
+ function logBytes29(bytes29 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
+ }
+
+ function logBytes30(bytes30 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
+ }
+
+ function logBytes31(bytes31 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
+ }
+
+ function logBytes32(bytes32 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
+ }
+
+ function log(uint256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
+ }
+
+ function log(int256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
+ }
+
+ function log(string memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function log(bool p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function log(address p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function log(uint256 p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
+ }
+
+ function log(uint256 p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
+ }
+
+ function log(uint256 p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
+ }
+
+ function log(uint256 p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
+ }
+
+ function log(string memory p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
+ }
+
+ function log(string memory p0, int256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1));
+ }
+
+ function log(string memory p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
+ }
+
+ function log(string memory p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
+ }
+
+ function log(string memory p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
+ }
+
+ function log(bool p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
+ }
+
+ function log(bool p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
+ }
+
+ function log(bool p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
+ }
+
+ function log(bool p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
+ }
+
+ function log(address p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
+ }
+
+ function log(address p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
+ }
+
+ function log(address p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
+ }
+
+ function log(address p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/console2.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/console2.sol
new file mode 100644
index 000000000..1ecdbbf72
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/console2.sol
@@ -0,0 +1,4 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {console as console2} from "./console.sol";
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC1155.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC1155.sol
new file mode 100644
index 000000000..9bf979dc5
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC1155.sol
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {IERC165} from "./IERC165.sol";
+
+/// @title ERC-1155 Multi Token Standard
+/// @dev See https://eips.ethereum.org/EIPS/eip-1155
+/// Note: The ERC-165 identifier for this interface is 0xd9b67a26.
+interface IERC1155 is IERC165 {
+ /// @dev
+ /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
+ /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender).
+ /// - The `_from` argument MUST be the address of the holder whose balance is decreased.
+ /// - The `_to` argument MUST be the address of the recipient whose balance is increased.
+ /// - The `_id` argument MUST be the token type being transferred.
+ /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
+ /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
+ /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
+ event TransferSingle(
+ address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value
+ );
+
+ /// @dev
+ /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
+ /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender).
+ /// - The `_from` argument MUST be the address of the holder whose balance is decreased.
+ /// - The `_to` argument MUST be the address of the recipient whose balance is increased.
+ /// - The `_ids` argument MUST be the list of tokens being transferred.
+ /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
+ /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
+ /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
+ event TransferBatch(
+ address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values
+ );
+
+ /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled).
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+
+ /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986.
+ /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
+ event URI(string _value, uint256 indexed _id);
+
+ /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
+ /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
+ /// - MUST revert if `_to` is the zero address.
+ /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
+ /// - MUST revert on any other error.
+ /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
+ /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
+ /// @param _from Source address
+ /// @param _to Target address
+ /// @param _id ID of the token type
+ /// @param _value Transfer amount
+ /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
+ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
+
+ /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
+ /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
+ /// - MUST revert if `_to` is the zero address.
+ /// - MUST revert if length of `_ids` is not the same as length of `_values`.
+ /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
+ /// - MUST revert on any other error.
+ /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
+ /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
+ /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
+ /// @param _from Source address
+ /// @param _to Target address
+ /// @param _ids IDs of each token type (order and length must match _values array)
+ /// @param _values Transfer amounts per token type (order and length must match _ids array)
+ /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
+ function safeBatchTransferFrom(
+ address _from,
+ address _to,
+ uint256[] calldata _ids,
+ uint256[] calldata _values,
+ bytes calldata _data
+ ) external;
+
+ /// @notice Get the balance of an account's tokens.
+ /// @param _owner The address of the token holder
+ /// @param _id ID of the token
+ /// @return The _owner's balance of the token type requested
+ function balanceOf(address _owner, uint256 _id) external view returns (uint256);
+
+ /// @notice Get the balance of multiple account/token pairs
+ /// @param _owners The addresses of the token holders
+ /// @param _ids ID of the tokens
+ /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair)
+ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
+ external
+ view
+ returns (uint256[] memory);
+
+ /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
+ /// @dev MUST emit the ApprovalForAll event on success.
+ /// @param _operator Address to add to the set of authorized operators
+ /// @param _approved True if the operator is approved, false to revoke approval
+ function setApprovalForAll(address _operator, bool _approved) external;
+
+ /// @notice Queries the approval status of an operator for a given owner.
+ /// @param _owner The owner of the tokens
+ /// @param _operator Address of authorized operator
+ /// @return True if the operator is approved, false if not
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC165.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC165.sol
new file mode 100644
index 000000000..fced18221
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC165.sol
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+interface IERC165 {
+ /// @notice Query if a contract implements an interface
+ /// @param interfaceID The interface identifier, as specified in ERC-165
+ /// @dev Interface identification is specified in ERC-165. This function
+ /// uses less than 30,000 gas.
+ /// @return `true` if the contract implements `interfaceID` and
+ /// `interfaceID` is not 0xffffffff, `false` otherwise
+ function supportsInterface(bytes4 interfaceID) external view returns (bool);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC20.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC20.sol
new file mode 100644
index 000000000..1a17fe134
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC20.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+/// @dev Interface of the ERC20 standard as defined in the EIP.
+/// @dev This includes the optional name, symbol, and decimals metadata.
+interface IERC20 {
+ /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).
+ event Transfer(address indexed from, address indexed to, uint256 value);
+
+ /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`
+ /// is the new allowance.
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ /// @notice Returns the amount of tokens in existence.
+ function totalSupply() external view returns (uint256);
+
+ /// @notice Returns the amount of tokens owned by `account`.
+ function balanceOf(address account) external view returns (uint256);
+
+ /// @notice Moves `amount` tokens from the caller's account to `to`.
+ function transfer(address to, uint256 amount) external returns (bool);
+
+ /// @notice Returns the remaining number of tokens that `spender` is allowed
+ /// to spend on behalf of `owner`
+ function allowance(address owner, address spender) external view returns (uint256);
+
+ /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.
+ /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.
+ /// `amount` is then deducted from the caller's allowance.
+ function transferFrom(address from, address to, uint256 amount) external returns (bool);
+
+ /// @notice Returns the name of the token.
+ function name() external view returns (string memory);
+
+ /// @notice Returns the symbol of the token.
+ function symbol() external view returns (string memory);
+
+ /// @notice Returns the decimals places of the token.
+ function decimals() external view returns (uint8);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC4626.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC4626.sol
new file mode 100644
index 000000000..1812c6e99
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC4626.sol
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {IERC20} from "./IERC20.sol";
+
+/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in
+/// https://eips.ethereum.org/EIPS/eip-4626
+interface IERC4626 is IERC20 {
+ event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
+
+ event Withdraw(
+ address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
+ );
+
+ /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
+ /// @dev
+ /// - MUST be an ERC-20 token contract.
+ /// - MUST NOT revert.
+ function asset() external view returns (address assetTokenAddress);
+
+ /// @notice Returns the total amount of the underlying asset that is “managed” by Vault.
+ /// @dev
+ /// - SHOULD include any compounding that occurs from yield.
+ /// - MUST be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT revert.
+ function totalAssets() external view returns (uint256 totalManagedAssets);
+
+ /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal
+ /// scenario where all the conditions are met.
+ /// @dev
+ /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT show any variations depending on the caller.
+ /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ /// from.
+ function convertToShares(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal
+ /// scenario where all the conditions are met.
+ /// @dev
+ /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT show any variations depending on the caller.
+ /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ /// from.
+ function convertToAssets(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
+ /// through a deposit call.
+ /// @dev
+ /// - MUST return a limited value if receiver is subject to some deposit limit.
+ /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
+ /// - MUST NOT revert.
+ function maxDeposit(address receiver) external view returns (uint256 maxAssets);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
+ /// current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
+ /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
+ /// in the same transaction.
+ /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
+ /// deposit would be accepted, regardless if the user has enough tokens approved, etc.
+ /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ function previewDeposit(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
+ /// @dev
+ /// - MUST emit the Deposit event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// deposit execution, and are accounted for during deposit.
+ /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
+ /// approving enough underlying tokens to the Vault contract, etc).
+ ///
+ /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ function deposit(uint256 assets, address receiver) external returns (uint256 shares);
+
+ /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
+ /// @dev
+ /// - MUST return a limited value if receiver is subject to some mint limit.
+ /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
+ /// - MUST NOT revert.
+ function maxMint(address receiver) external view returns (uint256 maxShares);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
+ /// current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
+ /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
+ /// same transaction.
+ /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
+ /// would be accepted, regardless if the user has enough tokens approved, etc.
+ /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by minting.
+ function previewMint(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
+ /// @dev
+ /// - MUST emit the Deposit event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
+ /// execution, and are accounted for during mint.
+ /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
+ /// approving enough underlying tokens to the Vault contract, etc).
+ ///
+ /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ function mint(uint256 shares, address receiver) external returns (uint256 assets);
+
+ /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
+ /// Vault, through a withdrawal call.
+ /// @dev
+ /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ /// - MUST NOT revert.
+ function maxWithdraw(address owner) external view returns (uint256 maxAssets);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
+ /// given current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
+ /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
+ /// called
+ /// in the same transaction.
+ /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
+ /// the withdrawal would be accepted, regardless if the user has enough shares, etc.
+ /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ function previewWithdraw(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver.
+ /// @dev
+ /// - MUST emit the Withdraw event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// withdraw execution, and are accounted for during withdrawal.
+ /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
+ /// not having enough shares, etc).
+ ///
+ /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ /// Those methods should be performed separately.
+ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
+
+ /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
+ /// through a redeem call.
+ /// @dev
+ /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
+ /// - MUST NOT revert.
+ function maxRedeem(address owner) external view returns (uint256 maxShares);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
+ /// given current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
+ /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
+ /// same transaction.
+ /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
+ /// redemption would be accepted, regardless if the user has enough shares, etc.
+ /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by redeeming.
+ function previewRedeem(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver.
+ /// @dev
+ /// - MUST emit the Withdraw event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// redeem execution, and are accounted for during redeem.
+ /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
+ /// not having enough shares, etc).
+ ///
+ /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ /// Those methods should be performed separately.
+ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC6909.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC6909.sol
new file mode 100644
index 000000000..d448b0fa3
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC6909.sol
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {IERC165} from "./IERC165.sol";
+
+/// @dev Required interface of an ERC-6909 compliant contract, as defined in
+/// https://eips.ethereum.org/EIPS/eip-6909
+interface IERC6909 is IERC165 {
+ /// @dev Emitted when the allowance of a `spender` for an `owner` is set for a token of type `id`.
+ event Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount);
+
+ /// @dev Emitted when `owner` grants or revokes operator status for a `spender`.
+ event OperatorSet(address indexed owner, address indexed spender, bool approved);
+
+ /// @dev Emitted when `amount` tokens of type `id` are moved from `sender` to `receiver` initiated by `caller`.
+ event Transfer(
+ address caller, address indexed sender, address indexed receiver, uint256 indexed id, uint256 amount
+ );
+
+ ///@dev Returns the amount of tokens of type `id` owned by `owner`.
+ function balanceOf(address owner, uint256 id) external view returns (uint256);
+
+ /// @dev Returns the amount of tokens of type `id` that `spender` is allowed to spend on behalf of `owner`.
+ /// NOTE: Does not include operator allowances.
+ function allowance(address owner, address spender, uint256 id) external view returns (uint256);
+
+ /// @dev Returns true if `spender` is set as an operator for `owner`.
+ function isOperator(address owner, address spender) external view returns (bool);
+
+ /// @dev Sets an approval to `spender` for `amount` tokens of type `id` from the caller's tokens.
+ /// Must return true.
+ function approve(address spender, uint256 id, uint256 amount) external returns (bool);
+
+ /// @dev Grants or revokes unlimited transfer permission of any token id to `spender` for the caller's tokens.
+ /// Must return true.
+ function setOperator(address spender, bool approved) external returns (bool);
+
+ /// @dev Transfers `amount` of token type `id` from the caller's account to `receiver`.
+ /// Must return true.
+ function transfer(address receiver, uint256 id, uint256 amount) external returns (bool);
+
+ /// @dev Transfers `amount` of token type `id` from `sender` to `receiver`.
+ /// Must return true.
+ function transferFrom(address sender, address receiver, uint256 id, uint256 amount) external returns (bool);
+}
+
+/// @dev Optional extension of {IERC6909} that adds metadata functions.
+interface IERC6909Metadata is IERC6909 {
+ /// @dev Returns the name of the token of type `id`.
+ function name(uint256 id) external view returns (string memory);
+
+ /// @dev Returns the ticker symbol of the token of type `id`.
+ function symbol(uint256 id) external view returns (string memory);
+
+ /// @dev Returns the number of decimals for the token of type `id`.
+ function decimals(uint256 id) external view returns (uint8);
+}
+
+/// @dev Optional extension of {IERC6909} that adds content URI functions.
+interface IERC6909ContentURI is IERC6909 {
+ /// @dev Returns URI for the contract.
+ function contractURI() external view returns (string memory);
+
+ /// @dev Returns the URI for the token of type `id`.
+ function tokenURI(uint256 id) external view returns (string memory);
+}
+
+/// @dev Optional extension of {IERC6909} that adds a token supply function.
+interface IERC6909TokenSupply is IERC6909 {
+ /// @dev Returns the total supply of the token of type `id`.
+ function totalSupply(uint256 id) external view returns (uint256);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC721.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC721.sol
new file mode 100644
index 000000000..9a03145ac
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC721.sol
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {IERC165} from "./IERC165.sol";
+
+/// @title ERC-721 Non-Fungible Token Standard
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.
+interface IERC721 is IERC165 {
+ /// @dev This emits when ownership of any NFT changes by any mechanism.
+ /// This event emits when NFTs are created (`from` == 0) and destroyed
+ /// (`to` == 0). Exception: during contract creation, any number of NFTs
+ /// may be created and assigned without emitting Transfer. At the time of
+ /// any transfer, the approved address for that NFT (if any) is reset to none.
+ event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
+
+ /// @dev This emits when the approved address for an NFT is changed or
+ /// reaffirmed. The zero address indicates there is no approved address.
+ /// When a Transfer event emits, this also indicates that the approved
+ /// address for that NFT (if any) is reset to none.
+ event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
+
+ /// @dev This emits when an operator is enabled or disabled for an owner.
+ /// The operator can manage all NFTs of the owner.
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+
+ /// @notice Count all NFTs assigned to an owner
+ /// @dev NFTs assigned to the zero address are considered invalid, and this
+ /// function throws for queries about the zero address.
+ /// @param _owner An address for whom to query the balance
+ /// @return The number of NFTs owned by `_owner`, possibly zero
+ function balanceOf(address _owner) external view returns (uint256);
+
+ /// @notice Find the owner of an NFT
+ /// @dev NFTs assigned to zero address are considered invalid, and queries
+ /// about them do throw.
+ /// @param _tokenId The identifier for an NFT
+ /// @return The address of the owner of the NFT
+ function ownerOf(uint256 _tokenId) external view returns (address);
+
+ /// @notice Transfers the ownership of an NFT from one address to another address
+ /// @dev Throws unless `msg.sender` is the current owner, an authorized
+ /// operator, or the approved address for this NFT. Throws if `_from` is
+ /// not the current owner. Throws if `_to` is the zero address. Throws if
+ /// `_tokenId` is not a valid NFT. When transfer is complete, this function
+ /// checks if `_to` is a smart contract (code size > 0). If so, it calls
+ /// `onERC721Received` on `_to` and throws if the return value is not
+ /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ /// @param data Additional data with no specified format, sent in call to `_to`
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
+
+ /// @notice Transfers the ownership of an NFT from one address to another address
+ /// @dev This works identically to the other function with an extra data parameter,
+ /// except this function just sets data to "".
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
+
+ /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+ /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+ /// THEY MAY BE PERMANENTLY LOST
+ /// @dev Throws unless `msg.sender` is the current owner, an authorized
+ /// operator, or the approved address for this NFT. Throws if `_from` is
+ /// not the current owner. Throws if `_to` is the zero address. Throws if
+ /// `_tokenId` is not a valid NFT.
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
+
+ /// @notice Change or reaffirm the approved address for an NFT
+ /// @dev The zero address indicates there is no approved address.
+ /// Throws unless `msg.sender` is the current NFT owner, or an authorized
+ /// operator of the current owner.
+ /// @param _approved The new approved NFT controller
+ /// @param _tokenId The NFT to approve
+ function approve(address _approved, uint256 _tokenId) external payable;
+
+ /// @notice Enable or disable approval for a third party ("operator") to manage
+ /// all of `msg.sender`'s assets
+ /// @dev Emits the ApprovalForAll event. The contract MUST allow
+ /// multiple operators per owner.
+ /// @param _operator Address to add to the set of authorized operators
+ /// @param _approved True if the operator is approved, false to revoke approval
+ function setApprovalForAll(address _operator, bool _approved) external;
+
+ /// @notice Get the approved address for a single NFT
+ /// @dev Throws if `_tokenId` is not a valid NFT.
+ /// @param _tokenId The NFT to find the approved address for
+ /// @return The approved address for this NFT, or the zero address if there is none
+ function getApproved(uint256 _tokenId) external view returns (address);
+
+ /// @notice Query if an address is an authorized operator for another address
+ /// @param _owner The address that owns the NFTs
+ /// @param _operator The address that acts on behalf of the owner
+ /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+}
+
+/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
+interface IERC721TokenReceiver {
+ /// @notice Handle the receipt of an NFT
+ /// @dev The ERC721 smart contract calls this function on the recipient
+ /// after a `transfer`. This function MAY throw to revert and reject the
+ /// transfer. Return of other than the magic value MUST result in the
+ /// transaction being reverted.
+ /// Note: the contract address is always the message sender.
+ /// @param _operator The address which called `safeTransferFrom` function
+ /// @param _from The address which previously owned the token
+ /// @param _tokenId The NFT identifier which is being transferred
+ /// @param _data Additional data with no specified format
+ /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
+ /// unless throwing
+ function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)
+ external
+ returns (bytes4);
+}
+
+/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.
+interface IERC721Metadata is IERC721 {
+ /// @notice A descriptive name for a collection of NFTs in this contract
+ function name() external view returns (string memory _name);
+
+ /// @notice An abbreviated name for NFTs in this contract
+ function symbol() external view returns (string memory _symbol);
+
+ /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+ /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
+ /// 3986. The URI may point to a JSON file that conforms to the "ERC721
+ /// Metadata JSON Schema".
+ function tokenURI(uint256 _tokenId) external view returns (string memory);
+}
+
+/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x780e9d63.
+interface IERC721Enumerable is IERC721 {
+ /// @notice Count NFTs tracked by this contract
+ /// @return A count of valid NFTs tracked by this contract, where each one of
+ /// them has an assigned and queryable owner not equal to the zero address
+ function totalSupply() external view returns (uint256);
+
+ /// @notice Enumerate valid NFTs
+ /// @dev Throws if `_index` >= `totalSupply()`.
+ /// @param _index A counter less than `totalSupply()`
+ /// @return The token identifier for the `_index`th NFT,
+ /// (sort order not specified)
+ function tokenByIndex(uint256 _index) external view returns (uint256);
+
+ /// @notice Enumerate NFTs assigned to an owner
+ /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
+ /// `_owner` is the zero address, representing invalid NFTs.
+ /// @param _owner An address where we are interested in NFTs owned by them
+ /// @param _index A counter less than `balanceOf(_owner)`
+ /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
+ /// (sort order not specified)
+ function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC7540.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC7540.sol
new file mode 100644
index 000000000..4cb085924
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC7540.sol
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {IERC7575} from "./IERC7575.sol";
+
+/// @dev Interface of the base operator logic of ERC7540, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7540
+interface IERC7540Operator {
+ /**
+ * @dev The event emitted when an operator is set.
+ *
+ * @param controller The address of the controller.
+ * @param operator The address of the operator.
+ * @param approved The approval status.
+ */
+ event OperatorSet(address indexed controller, address indexed operator, bool approved);
+
+ /**
+ * @dev Sets or removes an operator for the caller.
+ *
+ * @param operator The address of the operator.
+ * @param approved The approval status.
+ * @return Whether the call was executed successfully or not
+ */
+ function setOperator(address operator, bool approved) external returns (bool);
+
+ /**
+ * @dev Returns `true` if the `operator` is approved as an operator for an `controller`.
+ *
+ * @param controller The address of the controller.
+ * @param operator The address of the operator.
+ * @return status The approval status
+ */
+ function isOperator(address controller, address operator) external view returns (bool status);
+}
+
+/// @dev Interface of the asynchronous deposit Vault interface of ERC7540, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7540
+interface IERC7540Deposit is IERC7540Operator {
+ event DepositRequest(
+ address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets
+ );
+ /**
+ * @dev Transfers assets from sender into the Vault and submits a Request for asynchronous deposit.
+ *
+ * - MUST support ERC-20 approve / transferFrom on asset as a deposit Request flow.
+ * - MUST revert if all of assets cannot be requested for deposit.
+ * - owner MUST be msg.sender unless some unspecified explicit approval is given by the caller,
+ * approval of ERC-20 tokens from owner to sender is NOT enough.
+ *
+ * @param assets the amount of deposit assets to transfer from owner
+ * @param controller the controller of the request who will be able to operate the request
+ * @param owner the source of the deposit assets
+ *
+ * NOTE: most implementations will require pre-approval of the Vault with the Vault's underlying asset token.
+ */
+
+ function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId);
+
+ /**
+ * @dev Returns the amount of requested assets in Pending state.
+ *
+ * - MUST NOT include any assets in Claimable state for deposit or mint.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
+ */
+ function pendingDepositRequest(uint256 requestId, address controller) external view returns (uint256 pendingAssets);
+
+ /**
+ * @dev Returns the amount of requested assets in Claimable state for the controller to deposit or mint.
+ *
+ * - MUST NOT include any assets in Pending state.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
+ */
+ function claimableDepositRequest(uint256 requestId, address controller)
+ external
+ view
+ returns (uint256 claimableAssets);
+
+ /**
+ * @dev Mints shares Vault shares to receiver by claiming the Request of the controller.
+ *
+ * - MUST emit the Deposit event.
+ * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator.
+ */
+ function deposit(uint256 assets, address receiver, address controller) external returns (uint256 shares);
+
+ /**
+ * @dev Mints exactly shares Vault shares to receiver by claiming the Request of the controller.
+ *
+ * - MUST emit the Deposit event.
+ * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator.
+ */
+ function mint(uint256 shares, address receiver, address controller) external returns (uint256 assets);
+}
+
+/// @dev Interface of the asynchronous deposit Vault interface of ERC7540, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7540
+interface IERC7540Redeem is IERC7540Operator {
+ event RedeemRequest(
+ address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets
+ );
+
+ /**
+ * @dev Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem.
+ *
+ * - MUST support a redeem Request flow where the control of shares is taken from sender directly
+ * where msg.sender has ERC-20 approval over the shares of owner.
+ * - MUST revert if all of shares cannot be requested for redeem.
+ *
+ * @param shares the amount of shares to be redeemed to transfer from owner
+ * @param controller the controller of the request who will be able to operate the request
+ * @param owner the source of the shares to be redeemed
+ *
+ * NOTE: most implementations will require pre-approval of the Vault with the Vault's share token.
+ */
+ function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId);
+
+ /**
+ * @dev Returns the amount of requested shares in Pending state.
+ *
+ * - MUST NOT include any shares in Claimable state for redeem or withdraw.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
+ */
+ function pendingRedeemRequest(uint256 requestId, address controller) external view returns (uint256 pendingShares);
+
+ /**
+ * @dev Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw.
+ *
+ * - MUST NOT include any shares in Pending state for redeem or withdraw.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
+ */
+ function claimableRedeemRequest(uint256 requestId, address controller)
+ external
+ view
+ returns (uint256 claimableShares);
+}
+
+/// @dev Interface of the fully asynchronous Vault interface of ERC7540, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7540
+interface IERC7540 is IERC7540Deposit, IERC7540Redeem, IERC7575 {}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC7575.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC7575.sol
new file mode 100644
index 000000000..4d9d03c80
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC7575.sol
@@ -0,0 +1,241 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {IERC165} from "./IERC165.sol";
+
+/// @dev Interface of the ERC7575 "Multi-Asset ERC-4626 Vaults", as defined in
+/// https://eips.ethereum.org/EIPS/eip-7575
+interface IERC7575 is IERC165 {
+ event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
+ event Withdraw(
+ address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
+ );
+
+ /**
+ * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
+ *
+ * - MUST be an ERC-20 token contract.
+ * - MUST NOT revert.
+ */
+ function asset() external view returns (address assetTokenAddress);
+
+ /**
+ * @dev Returns the address of the share token
+ *
+ * - MUST be an ERC-20 token contract.
+ * - MUST NOT revert.
+ */
+ function share() external view returns (address shareTokenAddress);
+
+ /**
+ * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal
+ * scenario where all the conditions are met.
+ *
+ * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ * - MUST NOT revert.
+ *
+ * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ * from.
+ */
+ function convertToShares(uint256 assets) external view returns (uint256 shares);
+
+ /**
+ * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal
+ * scenario where all the conditions are met.
+ *
+ * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ * - MUST NOT revert.
+ *
+ * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ * from.
+ */
+ function convertToAssets(uint256 shares) external view returns (uint256 assets);
+
+ /**
+ * @dev Returns the total amount of the underlying asset that is “managed” by Vault.
+ *
+ * - SHOULD include any compounding that occurs from yield.
+ * - MUST be inclusive of any fees that are charged against assets in the Vault.
+ * - MUST NOT revert.
+ */
+ function totalAssets() external view returns (uint256 totalManagedAssets);
+
+ /**
+ * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
+ * through a deposit call.
+ *
+ * - MUST return a limited value if receiver is subject to some deposit limit.
+ * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
+ * - MUST NOT revert.
+ */
+ function maxDeposit(address receiver) external view returns (uint256 maxAssets);
+
+ /**
+ * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
+ * current on-chain conditions.
+ *
+ * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
+ * call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
+ * in the same transaction.
+ * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
+ * deposit would be accepted, regardless if the user has enough tokens approved, etc.
+ * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ * - MUST NOT revert.
+ *
+ * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
+ * share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ */
+ function previewDeposit(uint256 assets) external view returns (uint256 shares);
+
+ /**
+ * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
+ *
+ * - MUST emit the Deposit event.
+ * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ * deposit execution, and are accounted for during deposit.
+ * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
+ * approving enough underlying tokens to the Vault contract, etc).
+ *
+ * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ */
+ function deposit(uint256 assets, address receiver) external returns (uint256 shares);
+
+ /**
+ * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
+ * - MUST return a limited value if receiver is subject to some mint limit.
+ * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
+ * - MUST NOT revert.
+ */
+ function maxMint(address receiver) external view returns (uint256 maxShares);
+
+ /**
+ * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
+ * current on-chain conditions.
+ *
+ * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
+ * in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
+ * same transaction.
+ * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
+ * would be accepted, regardless if the user has enough tokens approved, etc.
+ * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ * - MUST NOT revert.
+ *
+ * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
+ * share price or some other type of condition, meaning the depositor will lose assets by minting.
+ */
+ function previewMint(uint256 shares) external view returns (uint256 assets);
+
+ /**
+ * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
+ *
+ * - MUST emit the Deposit event.
+ * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
+ * execution, and are accounted for during mint.
+ * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
+ * approving enough underlying tokens to the Vault contract, etc).
+ *
+ * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ */
+ function mint(uint256 shares, address receiver) external returns (uint256 assets);
+
+ /**
+ * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
+ * Vault, through a withdraw call.
+ *
+ * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ * - MUST NOT revert.
+ */
+ function maxWithdraw(address owner) external view returns (uint256 maxAssets);
+
+ /**
+ * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
+ * given current on-chain conditions.
+ *
+ * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
+ * call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
+ * called
+ * in the same transaction.
+ * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
+ * the withdrawal would be accepted, regardless if the user has enough shares, etc.
+ * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ * - MUST NOT revert.
+ *
+ * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
+ * share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ */
+ function previewWithdraw(uint256 assets) external view returns (uint256 shares);
+
+ /**
+ * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.
+ *
+ * - MUST emit the Withdraw event.
+ * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ * withdraw execution, and are accounted for during withdraw.
+ * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
+ * not having enough shares, etc).
+ *
+ * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ * Those methods should be performed separately.
+ */
+ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
+
+ /**
+ * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
+ * through a redeem call.
+ *
+ * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
+ * - MUST NOT revert.
+ */
+ function maxRedeem(address owner) external view returns (uint256 maxShares);
+
+ /**
+ * @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
+ * given current on-chain conditions.
+ *
+ * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
+ * in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
+ * same transaction.
+ * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
+ * redemption would be accepted, regardless if the user has enough shares, etc.
+ * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ * - MUST NOT revert.
+ *
+ * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
+ * share price or some other type of condition, meaning the depositor will lose assets by redeeming.
+ */
+ function previewRedeem(uint256 shares) external view returns (uint256 assets);
+
+ /**
+ * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.
+ *
+ * - MUST emit the Withdraw event.
+ * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ * redeem execution, and are accounted for during redeem.
+ * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
+ * not having enough shares, etc).
+ *
+ * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ * Those methods should be performed separately.
+ */
+ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
+}
+
+/// @dev Interface of the ERC20 share token, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7575
+interface IERC7575Share is IERC165 {
+ event VaultUpdate(address indexed asset, address vault);
+
+ /**
+ * @dev Returns the address of the Vault for the given asset.
+ *
+ * @param asset the ERC-20 token to deposit with into the Vault
+ */
+ function vault(address asset) external view returns (address);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IMulticall3.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IMulticall3.sol
new file mode 100644
index 000000000..6a94133e0
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IMulticall3.sol
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+interface IMulticall3 {
+ struct Call {
+ address target;
+ bytes callData;
+ }
+
+ struct Call3 {
+ address target;
+ bool allowFailure;
+ bytes callData;
+ }
+
+ struct Call3Value {
+ address target;
+ bool allowFailure;
+ uint256 value;
+ bytes callData;
+ }
+
+ struct Result {
+ bool success;
+ bytes returnData;
+ }
+
+ function aggregate(Call[] calldata calls) external payable returns (uint256 blockNumber, bytes[] memory returnData);
+
+ function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);
+
+ function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);
+
+ function blockAndAggregate(Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);
+
+ function getBasefee() external view returns (uint256 basefee);
+
+ function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);
+
+ function getBlockNumber() external view returns (uint256 blockNumber);
+
+ function getChainId() external view returns (uint256 chainid);
+
+ function getCurrentBlockCoinbase() external view returns (address coinbase);
+
+ function getCurrentBlockDifficulty() external view returns (uint256 difficulty);
+
+ function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);
+
+ function getCurrentBlockTimestamp() external view returns (uint256 timestamp);
+
+ function getEthBalance(address addr) external view returns (uint256 balance);
+
+ function getLastBlockHash() external view returns (bytes32 blockHash);
+
+ function tryAggregate(bool requireSuccess, Call[] calldata calls)
+ external
+ payable
+ returns (Result[] memory returnData);
+
+ function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/safeconsole.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/safeconsole.sol
new file mode 100644
index 000000000..e12d0600a
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/safeconsole.sol
@@ -0,0 +1,13248 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+/// @author philogy
+/// @dev Code generated automatically by script.
+library safeconsole {
+ uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;
+
+ // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)
+ // for the view-to-pure log trick.
+ function _sendLogPayload(uint256 offset, uint256 size) private pure {
+ function(uint256, uint256) internal view fnIn = _sendLogPayloadView;
+ function(uint256, uint256) internal pure pureSendLogPayload;
+ assembly ("memory-safe") {
+ pureSendLogPayload := fnIn
+ }
+ pureSendLogPayload(offset, size);
+ }
+
+ function _sendLogPayloadView(uint256 offset, uint256 size) private view {
+ assembly ("memory-safe") {
+ pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))
+ }
+ }
+
+ function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {
+ function(uint256, uint256, uint256) internal view fnIn = _memcopyView;
+ function(uint256, uint256, uint256) internal pure pureMemcopy;
+ assembly ("memory-safe") {
+ pureMemcopy := fnIn
+ }
+ pureMemcopy(fromOffset, toOffset, length);
+ }
+
+ function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {
+ assembly ("memory-safe") {
+ pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))
+ }
+ }
+
+ function logMemory(uint256 offset, uint256 length) internal pure {
+ if (offset >= 0x60) {
+ // Sufficient memory before slice to prepare call header.
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(sub(offset, 0x60))
+ m1 := mload(sub(offset, 0x40))
+ m2 := mload(sub(offset, 0x20))
+ // Selector of `log(bytes)`.
+ mstore(sub(offset, 0x60), 0x0be77f56)
+ mstore(sub(offset, 0x40), 0x20)
+ mstore(sub(offset, 0x20), length)
+ }
+ _sendLogPayload(offset - 0x44, length + 0x44);
+ assembly ("memory-safe") {
+ mstore(sub(offset, 0x60), m0)
+ mstore(sub(offset, 0x40), m1)
+ mstore(sub(offset, 0x20), m2)
+ }
+ } else {
+ // Insufficient space, so copy slice forward, add header and reverse.
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ uint256 endOffset = offset + length;
+ assembly ("memory-safe") {
+ m0 := mload(add(endOffset, 0x00))
+ m1 := mload(add(endOffset, 0x20))
+ m2 := mload(add(endOffset, 0x40))
+ }
+ _memcopy(offset, offset + 0x60, length);
+ assembly ("memory-safe") {
+ // Selector of `log(bytes)`.
+ mstore(add(offset, 0x00), 0x0be77f56)
+ mstore(add(offset, 0x20), 0x20)
+ mstore(add(offset, 0x40), length)
+ }
+ _sendLogPayload(offset + 0x1c, length + 0x44);
+ _memcopy(offset + 0x60, offset, length);
+ assembly ("memory-safe") {
+ mstore(add(endOffset, 0x00), m0)
+ mstore(add(endOffset, 0x20), m1)
+ mstore(add(endOffset, 0x40), m2)
+ }
+ }
+ }
+
+ function log(address p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(address)`.
+ mstore(0x00, 0x2c2ecbc2)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(bool p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(bool)`.
+ mstore(0x00, 0x32458eed)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(uint256 p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(uint256)`.
+ mstore(0x00, 0xf82c50f1)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(bytes32 p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(string)`.
+ mstore(0x00, 0x41304fac)
+ mstore(0x20, 0x20)
+ writeString(0x40, p0)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,address)`.
+ mstore(0x00, 0xdaf0d4aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,bool)`.
+ mstore(0x00, 0x75b605d3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,uint256)`.
+ mstore(0x00, 0x8309e8a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,string)`.
+ mstore(0x00, 0x759f86bb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,address)`.
+ mstore(0x00, 0x853c4849)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,bool)`.
+ mstore(0x00, 0x2a110e83)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,uint256)`.
+ mstore(0x00, 0x399174d3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,string)`.
+ mstore(0x00, 0x8feac525)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,address)`.
+ mstore(0x00, 0x69276c86)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,bool)`.
+ mstore(0x00, 0x1c9d7eb3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,uint256)`.
+ mstore(0x00, 0xf666715a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,string)`.
+ mstore(0x00, 0x643fd0df)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,address)`.
+ mstore(0x00, 0x319af333)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,bool)`.
+ mstore(0x00, 0xc3b55635)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,uint256)`.
+ mstore(0x00, 0xb60e72cc)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,string)`.
+ mstore(0x00, 0x4b5c4277)
+ mstore(0x20, 0x40)
+ mstore(0x40, 0x80)
+ writeString(0x60, p0)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,address)`.
+ mstore(0x00, 0x018c84c2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,bool)`.
+ mstore(0x00, 0xf2a66286)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,uint256)`.
+ mstore(0x00, 0x17fe6185)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,address,string)`.
+ mstore(0x00, 0x007150be)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,address)`.
+ mstore(0x00, 0xf11699ed)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,bool)`.
+ mstore(0x00, 0xeb830c92)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,uint256)`.
+ mstore(0x00, 0x9c4f99fb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,bool,string)`.
+ mstore(0x00, 0x212255cc)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,address)`.
+ mstore(0x00, 0x7bc0d848)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,bool)`.
+ mstore(0x00, 0x678209a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,uint256)`.
+ mstore(0x00, 0xb69bcaf6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,uint256,string)`.
+ mstore(0x00, 0xa1f2e8aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,address)`.
+ mstore(0x00, 0xf08744e8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,bool)`.
+ mstore(0x00, 0xcf020fb1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,uint256)`.
+ mstore(0x00, 0x67dd6ff1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(address,string,string)`.
+ mstore(0x00, 0xfb772265)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bool p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,address)`.
+ mstore(0x00, 0xd2763667)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,bool)`.
+ mstore(0x00, 0x18c9c746)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,uint256)`.
+ mstore(0x00, 0x5f7b9afb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,address,string)`.
+ mstore(0x00, 0xde9a9270)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,address)`.
+ mstore(0x00, 0x1078f68d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,bool)`.
+ mstore(0x00, 0x50709698)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,uint256)`.
+ mstore(0x00, 0x12f21602)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,bool,string)`.
+ mstore(0x00, 0x2555fa46)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,address)`.
+ mstore(0x00, 0x088ef9d2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,bool)`.
+ mstore(0x00, 0xe8defba9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,uint256)`.
+ mstore(0x00, 0x37103367)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,uint256,string)`.
+ mstore(0x00, 0xc3fc3970)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,address)`.
+ mstore(0x00, 0x9591b953)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,bool)`.
+ mstore(0x00, 0xdbb4c247)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,uint256)`.
+ mstore(0x00, 0x1093ee11)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(bool,string,string)`.
+ mstore(0x00, 0xb076847f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,address)`.
+ mstore(0x00, 0xbcfd9be0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,bool)`.
+ mstore(0x00, 0x9b6ec042)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,uint256)`.
+ mstore(0x00, 0x5a9b5ed5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,address,string)`.
+ mstore(0x00, 0x63cb41f9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,address)`.
+ mstore(0x00, 0x35085f7b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,bool)`.
+ mstore(0x00, 0x20718650)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,uint256)`.
+ mstore(0x00, 0x20098014)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,bool,string)`.
+ mstore(0x00, 0x85775021)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,address)`.
+ mstore(0x00, 0x5c96b331)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,bool)`.
+ mstore(0x00, 0x4766da72)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,uint256)`.
+ mstore(0x00, 0xd1ed7a3c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,uint256,string)`.
+ mstore(0x00, 0x71d04af2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,address)`.
+ mstore(0x00, 0x7afac959)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,bool)`.
+ mstore(0x00, 0x4ceda75a)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,uint256)`.
+ mstore(0x00, 0x37aa7d4c)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(uint256,string,string)`.
+ mstore(0x00, 0xb115611f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,address)`.
+ mstore(0x00, 0xfcec75e0)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,bool)`.
+ mstore(0x00, 0xc91d5ed4)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,uint256)`.
+ mstore(0x00, 0x0d26b925)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,address,string)`.
+ mstore(0x00, 0xe0e9ad4f)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,address)`.
+ mstore(0x00, 0x932bbb38)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,bool)`.
+ mstore(0x00, 0x850b7ad6)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,uint256)`.
+ mstore(0x00, 0xc95958d6)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,bool,string)`.
+ mstore(0x00, 0xe298f47d)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,address)`.
+ mstore(0x00, 0x1c7ec448)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,bool)`.
+ mstore(0x00, 0xca7733b1)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,uint256)`.
+ mstore(0x00, 0xca47c4eb)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,uint256,string)`.
+ mstore(0x00, 0x5970e089)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,address)`.
+ mstore(0x00, 0x95ed0195)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,bool)`.
+ mstore(0x00, 0xb0e0f9b5)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,uint256)`.
+ mstore(0x00, 0x5821efa1)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ // Selector of `log(string,string,string)`.
+ mstore(0x00, 0x2ced7cef)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, 0xe0)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ writeString(0x100, p2)
+ }
+ _sendLogPayload(0x1c, 0x124);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ }
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,address)`.
+ mstore(0x00, 0x665bf134)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,bool)`.
+ mstore(0x00, 0x0e378994)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,uint256)`.
+ mstore(0x00, 0x94250d77)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,address,string)`.
+ mstore(0x00, 0xf808da20)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,address)`.
+ mstore(0x00, 0x9f1bc36e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,bool)`.
+ mstore(0x00, 0x2cd4134a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,uint256)`.
+ mstore(0x00, 0x3971e78c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,bool,string)`.
+ mstore(0x00, 0xaa6540c8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,address)`.
+ mstore(0x00, 0x8da6def5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,bool)`.
+ mstore(0x00, 0x9b4254e2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,uint256)`.
+ mstore(0x00, 0xbe553481)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,uint256,string)`.
+ mstore(0x00, 0xfdb4f990)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,address)`.
+ mstore(0x00, 0x8f736d16)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,bool)`.
+ mstore(0x00, 0x6f1a594e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,uint256)`.
+ mstore(0x00, 0xef1cefe7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,address,string,string)`.
+ mstore(0x00, 0x21bdaf25)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,address)`.
+ mstore(0x00, 0x660375dd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,bool)`.
+ mstore(0x00, 0xa6f50b0f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,uint256)`.
+ mstore(0x00, 0xa75c59de)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,address,string)`.
+ mstore(0x00, 0x2dd778e6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,address)`.
+ mstore(0x00, 0xcf394485)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,bool)`.
+ mstore(0x00, 0xcac43479)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,uint256)`.
+ mstore(0x00, 0x8c4e5de6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,bool,string)`.
+ mstore(0x00, 0xdfc4a2e8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,address)`.
+ mstore(0x00, 0xccf790a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,bool)`.
+ mstore(0x00, 0xc4643e20)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,uint256)`.
+ mstore(0x00, 0x386ff5f4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,uint256,string)`.
+ mstore(0x00, 0x0aa6cfad)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,address)`.
+ mstore(0x00, 0x19fd4956)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,bool)`.
+ mstore(0x00, 0x50ad461d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,uint256)`.
+ mstore(0x00, 0x80e6a20b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,bool,string,string)`.
+ mstore(0x00, 0x475c5c33)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,address)`.
+ mstore(0x00, 0x478d1c62)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,bool)`.
+ mstore(0x00, 0xa1bcc9b3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,uint256)`.
+ mstore(0x00, 0x100f650e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,address,string)`.
+ mstore(0x00, 0x1da986ea)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,address)`.
+ mstore(0x00, 0xa31bfdcc)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,bool)`.
+ mstore(0x00, 0x3bf5e537)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,uint256)`.
+ mstore(0x00, 0x22f6b999)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,bool,string)`.
+ mstore(0x00, 0xc5ad85f9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,address)`.
+ mstore(0x00, 0x20e3984d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,bool)`.
+ mstore(0x00, 0x66f1bc67)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,uint256)`.
+ mstore(0x00, 0x34f0e636)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,uint256,string)`.
+ mstore(0x00, 0x4a28c017)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,address)`.
+ mstore(0x00, 0x5c430d47)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,bool)`.
+ mstore(0x00, 0xcf18105c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,uint256)`.
+ mstore(0x00, 0xbf01f891)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,uint256,string,string)`.
+ mstore(0x00, 0x88a8c406)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,address)`.
+ mstore(0x00, 0x0d36fa20)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,bool)`.
+ mstore(0x00, 0x0df12b76)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,uint256)`.
+ mstore(0x00, 0x457fe3cf)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,address,string)`.
+ mstore(0x00, 0xf7e36245)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,address)`.
+ mstore(0x00, 0x205871c2)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,bool)`.
+ mstore(0x00, 0x5f1d5c9f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,uint256)`.
+ mstore(0x00, 0x515e38b6)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,bool,string)`.
+ mstore(0x00, 0xbc0b61fe)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,address)`.
+ mstore(0x00, 0x63183678)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,bool)`.
+ mstore(0x00, 0x0ef7e050)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,uint256)`.
+ mstore(0x00, 0x1dc8e1b8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,uint256,string)`.
+ mstore(0x00, 0x448830a8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,address)`.
+ mstore(0x00, 0xa04e2f87)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,bool)`.
+ mstore(0x00, 0x35a5071f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,uint256)`.
+ mstore(0x00, 0x159f8927)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(address,string,string,string)`.
+ mstore(0x00, 0x5d02c50b)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,address)`.
+ mstore(0x00, 0x1d14d001)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,bool)`.
+ mstore(0x00, 0x46600be0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,uint256)`.
+ mstore(0x00, 0x0c66d1be)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,address,string)`.
+ mstore(0x00, 0xd812a167)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,address)`.
+ mstore(0x00, 0x1c41a336)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,bool)`.
+ mstore(0x00, 0x6a9c478b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,uint256)`.
+ mstore(0x00, 0x07831502)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,bool,string)`.
+ mstore(0x00, 0x4a66cb34)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,address)`.
+ mstore(0x00, 0x136b05dd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,bool)`.
+ mstore(0x00, 0xd6019f1c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,uint256)`.
+ mstore(0x00, 0x7bf181a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,uint256,string)`.
+ mstore(0x00, 0x51f09ff8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,address)`.
+ mstore(0x00, 0x6f7c603e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,bool)`.
+ mstore(0x00, 0xe2bfd60b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,uint256)`.
+ mstore(0x00, 0xc21f64c7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,address,string,string)`.
+ mstore(0x00, 0xa73c1db6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,address)`.
+ mstore(0x00, 0xf4880ea4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,bool)`.
+ mstore(0x00, 0xc0a302d8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,uint256)`.
+ mstore(0x00, 0x4c123d57)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,address,string)`.
+ mstore(0x00, 0xa0a47963)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,address)`.
+ mstore(0x00, 0x8c329b1a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,bool)`.
+ mstore(0x00, 0x3b2a5ce0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,uint256)`.
+ mstore(0x00, 0x6d7045c1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,bool,string)`.
+ mstore(0x00, 0x2ae408d4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,address)`.
+ mstore(0x00, 0x54a7a9a0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,bool)`.
+ mstore(0x00, 0x619e4d0e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,uint256)`.
+ mstore(0x00, 0x0bb00eab)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,uint256,string)`.
+ mstore(0x00, 0x7dd4d0e0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,address)`.
+ mstore(0x00, 0xf9ad2b89)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,bool)`.
+ mstore(0x00, 0xb857163a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,uint256)`.
+ mstore(0x00, 0xe3a9ca2f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,bool,string,string)`.
+ mstore(0x00, 0x6d1e8751)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,address)`.
+ mstore(0x00, 0x26f560a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,bool)`.
+ mstore(0x00, 0xb4c314ff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,uint256)`.
+ mstore(0x00, 0x1537dc87)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,address,string)`.
+ mstore(0x00, 0x1bb3b09a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,address)`.
+ mstore(0x00, 0x9acd3616)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,bool)`.
+ mstore(0x00, 0xceb5f4d7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,uint256)`.
+ mstore(0x00, 0x7f9bbca2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,bool,string)`.
+ mstore(0x00, 0x9143dbb1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,address)`.
+ mstore(0x00, 0x00dd87b9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,bool)`.
+ mstore(0x00, 0xbe984353)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,uint256)`.
+ mstore(0x00, 0x374bb4b2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,uint256,string)`.
+ mstore(0x00, 0x8e69fb5d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,address)`.
+ mstore(0x00, 0xfedd1fff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,bool)`.
+ mstore(0x00, 0xe5e70b2b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,uint256)`.
+ mstore(0x00, 0x6a1199e2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,uint256,string,string)`.
+ mstore(0x00, 0xf5bc2249)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,address)`.
+ mstore(0x00, 0x2b2b18dc)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,bool)`.
+ mstore(0x00, 0x6dd434ca)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,uint256)`.
+ mstore(0x00, 0xa5cada94)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,address,string)`.
+ mstore(0x00, 0x12d6c788)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,address)`.
+ mstore(0x00, 0x538e06ab)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,bool)`.
+ mstore(0x00, 0xdc5e935b)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,uint256)`.
+ mstore(0x00, 0x1606a393)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,bool,string)`.
+ mstore(0x00, 0x483d0416)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,address)`.
+ mstore(0x00, 0x1596a1ce)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,bool)`.
+ mstore(0x00, 0x6b0e5d53)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,uint256)`.
+ mstore(0x00, 0x28863fcb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,uint256,string)`.
+ mstore(0x00, 0x1ad96de6)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,address)`.
+ mstore(0x00, 0x97d394d8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,bool)`.
+ mstore(0x00, 0x1e4b87e5)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,uint256)`.
+ mstore(0x00, 0x7be0c3eb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(bool,string,string,string)`.
+ mstore(0x00, 0x1762e32a)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,address)`.
+ mstore(0x00, 0x2488b414)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,bool)`.
+ mstore(0x00, 0x091ffaf5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,uint256)`.
+ mstore(0x00, 0x736efbb6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,address,string)`.
+ mstore(0x00, 0x031c6f73)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,address)`.
+ mstore(0x00, 0xef72c513)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,bool)`.
+ mstore(0x00, 0xe351140f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,uint256)`.
+ mstore(0x00, 0x5abd992a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,bool,string)`.
+ mstore(0x00, 0x90fb06aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,address)`.
+ mstore(0x00, 0x15c127b5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,bool)`.
+ mstore(0x00, 0x5f743a7c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,uint256)`.
+ mstore(0x00, 0x0c9cd9c1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,uint256,string)`.
+ mstore(0x00, 0xddb06521)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,address)`.
+ mstore(0x00, 0x9cba8fff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,bool)`.
+ mstore(0x00, 0xcc32ab07)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,uint256)`.
+ mstore(0x00, 0x46826b5d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,address,string,string)`.
+ mstore(0x00, 0x3e128ca3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,address)`.
+ mstore(0x00, 0xa1ef4cbb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,bool)`.
+ mstore(0x00, 0x454d54a5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,uint256)`.
+ mstore(0x00, 0x078287f5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,address,string)`.
+ mstore(0x00, 0xade052c7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,address)`.
+ mstore(0x00, 0x69640b59)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,bool)`.
+ mstore(0x00, 0xb6f577a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,uint256)`.
+ mstore(0x00, 0x7464ce23)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,bool,string)`.
+ mstore(0x00, 0xdddb9561)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,address)`.
+ mstore(0x00, 0x88cb6041)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,bool)`.
+ mstore(0x00, 0x91a02e2a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,uint256)`.
+ mstore(0x00, 0xc6acc7a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,uint256,string)`.
+ mstore(0x00, 0xde03e774)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,address)`.
+ mstore(0x00, 0xef529018)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,bool)`.
+ mstore(0x00, 0xeb928d7f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,uint256)`.
+ mstore(0x00, 0x2c1d0746)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,bool,string,string)`.
+ mstore(0x00, 0x68c8b8bd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,address)`.
+ mstore(0x00, 0x56a5d1b1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,bool)`.
+ mstore(0x00, 0x15cac476)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,uint256)`.
+ mstore(0x00, 0x88f6e4b2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,address,string)`.
+ mstore(0x00, 0x6cde40b8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,address)`.
+ mstore(0x00, 0x9a816a83)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,bool)`.
+ mstore(0x00, 0xab085ae6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,uint256)`.
+ mstore(0x00, 0xeb7f6fd2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,bool,string)`.
+ mstore(0x00, 0xa5b4fc99)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,address)`.
+ mstore(0x00, 0xfa8185af)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,bool)`.
+ mstore(0x00, 0xc598d185)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ assembly ("memory-safe") {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,uint256)`.
+ mstore(0x00, 0x193fb800)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,uint256,string)`.
+ mstore(0x00, 0x59cfcbe3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,address)`.
+ mstore(0x00, 0x42d21db7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,bool)`.
+ mstore(0x00, 0x7af6ab25)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,uint256)`.
+ mstore(0x00, 0x5da297eb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,uint256,string,string)`.
+ mstore(0x00, 0x27d8afd2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,address)`.
+ mstore(0x00, 0x6168ed61)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,bool)`.
+ mstore(0x00, 0x90c30a56)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,uint256)`.
+ mstore(0x00, 0xe8d3018d)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,address,string)`.
+ mstore(0x00, 0x9c3adfa1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,address)`.
+ mstore(0x00, 0xae2ec581)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,bool)`.
+ mstore(0x00, 0xba535d9c)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,uint256)`.
+ mstore(0x00, 0xcf009880)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,bool,string)`.
+ mstore(0x00, 0xd2d423cd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,address)`.
+ mstore(0x00, 0x3b2279b4)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,bool)`.
+ mstore(0x00, 0x691a8f74)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,uint256)`.
+ mstore(0x00, 0x82c25b74)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,uint256,string)`.
+ mstore(0x00, 0xb7b914ca)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,address)`.
+ mstore(0x00, 0xd583c602)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,bool)`.
+ mstore(0x00, 0xb3a6b6bd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,uint256)`.
+ mstore(0x00, 0xb028c9bd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(uint256,string,string,string)`.
+ mstore(0x00, 0x21ad0683)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,address)`.
+ mstore(0x00, 0xed8f28f6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,bool)`.
+ mstore(0x00, 0xb59dbd60)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,uint256)`.
+ mstore(0x00, 0x8ef3f399)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,address,string)`.
+ mstore(0x00, 0x800a1c67)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,address)`.
+ mstore(0x00, 0x223603bd)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,bool)`.
+ mstore(0x00, 0x79884c2b)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,uint256)`.
+ mstore(0x00, 0x3e9f866a)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,bool,string)`.
+ mstore(0x00, 0x0454c079)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,address)`.
+ mstore(0x00, 0x63fb8bc5)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,bool)`.
+ mstore(0x00, 0xfc4845f0)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,uint256)`.
+ mstore(0x00, 0xf8f51b1e)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,uint256,string)`.
+ mstore(0x00, 0x5a477632)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,address)`.
+ mstore(0x00, 0xaabc9a31)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,bool)`.
+ mstore(0x00, 0x5f15d28c)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,uint256)`.
+ mstore(0x00, 0x91d1112e)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,address,string,string)`.
+ mstore(0x00, 0x245986f2)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,address)`.
+ mstore(0x00, 0x33e9dd1d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,bool)`.
+ mstore(0x00, 0x958c28c6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,uint256)`.
+ mstore(0x00, 0x5d08bb05)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,address,string)`.
+ mstore(0x00, 0x2d8e33a4)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,address)`.
+ mstore(0x00, 0x7190a529)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,bool)`.
+ mstore(0x00, 0x895af8c5)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,uint256)`.
+ mstore(0x00, 0x8e3f78a9)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,bool,string)`.
+ mstore(0x00, 0x9d22d5dd)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,address)`.
+ mstore(0x00, 0x935e09bf)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,bool)`.
+ mstore(0x00, 0x8af7cf8a)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,uint256)`.
+ mstore(0x00, 0x64b5bb67)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,uint256,string)`.
+ mstore(0x00, 0x742d6ee7)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,address)`.
+ mstore(0x00, 0xe0625b29)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,bool)`.
+ mstore(0x00, 0x3f8a701d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,uint256)`.
+ mstore(0x00, 0x24f91465)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,bool,string,string)`.
+ mstore(0x00, 0xa826caeb)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,address)`.
+ mstore(0x00, 0x5ea2b7ae)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,bool)`.
+ mstore(0x00, 0x82112a42)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,uint256)`.
+ mstore(0x00, 0x4f04fdc6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,address,string)`.
+ mstore(0x00, 0x9ffb2f93)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,address)`.
+ mstore(0x00, 0xe0e95b98)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,bool)`.
+ mstore(0x00, 0x354c36d6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,uint256)`.
+ mstore(0x00, 0xe41b6f6f)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,bool,string)`.
+ mstore(0x00, 0xabf73a98)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,address)`.
+ mstore(0x00, 0xe21de278)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,bool)`.
+ mstore(0x00, 0x7626db92)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,uint256)`.
+ mstore(0x00, 0xa7a87853)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,uint256,string)`.
+ mstore(0x00, 0x854b3496)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,address)`.
+ mstore(0x00, 0x7c4632a4)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,bool)`.
+ mstore(0x00, 0x7d24491d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,uint256)`.
+ mstore(0x00, 0xc67ea9d1)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,uint256,string,string)`.
+ mstore(0x00, 0x5ab84e1f)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,address)`.
+ mstore(0x00, 0x439c7bef)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,bool)`.
+ mstore(0x00, 0x5ccd4e37)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,uint256)`.
+ mstore(0x00, 0x7cc3c607)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,address,string)`.
+ mstore(0x00, 0xeb1bff80)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,address)`.
+ mstore(0x00, 0xc371c7db)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,bool)`.
+ mstore(0x00, 0x40785869)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,uint256)`.
+ mstore(0x00, 0xd6aefad2)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,bool,string)`.
+ mstore(0x00, 0x5e84b0ea)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,address)`.
+ mstore(0x00, 0x1023f7b2)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,bool)`.
+ mstore(0x00, 0xc3a8a654)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,uint256)`.
+ mstore(0x00, 0xf45d7d2c)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,uint256,string)`.
+ mstore(0x00, 0x5d1a971a)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,address)`.
+ mstore(0x00, 0x6d572f44)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,bool)`.
+ mstore(0x00, 0x2c1754ed)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,uint256)`.
+ mstore(0x00, 0x8eafb02b)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ bytes32 m11;
+ bytes32 m12;
+ assembly ("memory-safe") {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ m11 := mload(0x160)
+ m12 := mload(0x180)
+ // Selector of `log(string,string,string,string)`.
+ mstore(0x00, 0xde68f20a)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, 0x140)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ writeString(0x160, p3)
+ }
+ _sendLogPayload(0x1c, 0x184);
+ assembly ("memory-safe") {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ mstore(0x160, m11)
+ mstore(0x180, m12)
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/CommonBase.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/CommonBase.t.sol
new file mode 100644
index 000000000..28c91a912
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/CommonBase.t.sol
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {CommonBase} from "../src/Base.sol";
+import {StdConstants} from "../src/StdConstants.sol";
+import {Test} from "../src/Test.sol";
+
+contract CommonBaseTest is Test {
+ function testVmAddressValue() public pure {
+ assertEq(VM_ADDRESS, address(StdConstants.VM));
+ }
+
+ function testConsoleValue() public pure {
+ assertEq(CONSOLE, StdConstants.CONSOLE);
+ }
+
+ function testCreate2FactoryValue() public pure {
+ assertEq(CREATE2_FACTORY, StdConstants.CREATE2_FACTORY);
+ }
+
+ function testDefaultSenderValue() public pure {
+ assertEq(DEFAULT_SENDER, StdConstants.DEFAULT_SENDER);
+ }
+
+ function testDefaultTestContractValue() public pure {
+ assertEq(DEFAULT_TEST_CONTRACT, StdConstants.DEFAULT_TEST_CONTRACT);
+ }
+
+ function testMulticall3AddressValue() public pure {
+ assertEq(MULTICALL3_ADDRESS, address(StdConstants.MULTICALL3_ADDRESS));
+ }
+
+ function testSecp256k1OrderValue() public pure {
+ assertEq(SECP256K1_ORDER, StdConstants.SECP256K1_ORDER);
+ }
+
+ function testUint256MaxValue() public pure {
+ assertEq(UINT256_MAX, type(uint256).max);
+ }
+
+ function testVmValue() public pure {
+ assertEq(address(vm), address(StdConstants.VM));
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/Config.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/Config.t.sol
new file mode 100644
index 000000000..b5f3154d5
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/Config.t.sol
@@ -0,0 +1,381 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity ^0.8.13;
+
+import {Test} from "../src/Test.sol";
+import {Config} from "../src/Config.sol";
+import {StdConfig} from "../src/StdConfig.sol";
+
+contract ConfigTest is Test, Config {
+ function setUp() public {
+ vm.setEnv("MAINNET_RPC", "https://reth-ethereum.ithaca.xyz/rpc");
+ vm.setEnv("WETH_MAINNET", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");
+ vm.setEnv("OPTIMISM_RPC", "https://mainnet.optimism.io");
+ vm.setEnv("WETH_OPTIMISM", "0x4200000000000000000000000000000000000006");
+ }
+
+ function test_loadConfig() public {
+ // Deploy the config contract with the test fixture.
+ _loadConfig("./test/fixtures/config.toml", false);
+
+ // -- MAINNET --------------------------------------------------------------
+
+ // Read and assert RPC URL for Mainnet (chain ID 1)
+ assertEq(config.getRpcUrl(1), "https://reth-ethereum.ithaca.xyz/rpc");
+
+ // Read and assert boolean values
+ assertTrue(config.get(1, "is_live").toBool());
+ bool[] memory bool_array = config.get(1, "bool_array").toBoolArray();
+ assertTrue(bool_array[0]);
+ assertFalse(bool_array[1]);
+
+ // Read and assert address values
+ assertEq(config.get(1, "weth").toAddress(), 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
+ address[] memory address_array = config.get(1, "deps").toAddressArray();
+ assertEq(address_array[0], 0x0000000000000000000000000000000000000000);
+ assertEq(address_array[1], 0x1111111111111111111111111111111111111111);
+
+ // Read and assert bytes32 values
+ assertEq(config.get(1, "word").toBytes32(), bytes32(uint256(1234)));
+ bytes32[] memory bytes32_array = config.get(1, "word_array").toBytes32Array();
+ assertEq(bytes32_array[0], bytes32(uint256(5678)));
+ assertEq(bytes32_array[1], bytes32(uint256(9999)));
+
+ // Read and assert uint values
+ assertEq(config.get(1, "number").toUint256(), 1234);
+ uint256[] memory uint_array = config.get(1, "number_array").toUint256Array();
+ assertEq(uint_array[0], 5678);
+ assertEq(uint_array[1], 9999);
+
+ // Read and assert int values
+ assertEq(config.get(1, "signed_number").toInt256(), -1234);
+ int256[] memory int_array = config.get(1, "signed_number_array").toInt256Array();
+ assertEq(int_array[0], -5678);
+ assertEq(int_array[1], 9999);
+
+ // Read and assert bytes values
+ assertEq(config.get(1, "b").toBytes(), hex"abcd");
+ bytes[] memory bytes_array = config.get(1, "b_array").toBytesArray();
+ assertEq(bytes_array[0], hex"dead");
+ assertEq(bytes_array[1], hex"beef");
+
+ // Read and assert string values
+ assertEq(config.get(1, "str").toString(), "foo");
+ string[] memory string_array = config.get(1, "str_array").toStringArray();
+ assertEq(string_array[0], "bar");
+ assertEq(string_array[1], "baz");
+
+ // -- OPTIMISM ------------------------------------------------------------
+
+ // Read and assert RPC URL for Optimism (chain ID 10)
+ assertEq(config.getRpcUrl(10), "https://mainnet.optimism.io");
+
+ // Read and assert boolean values
+ assertFalse(config.get(10, "is_live").toBool());
+ bool_array = config.get(10, "bool_array").toBoolArray();
+ assertFalse(bool_array[0]);
+ assertTrue(bool_array[1]);
+
+ // Read and assert address values
+ assertEq(config.get(10, "weth").toAddress(), 0x4200000000000000000000000000000000000006);
+ address_array = config.get(10, "deps").toAddressArray();
+ assertEq(address_array[0], 0x2222222222222222222222222222222222222222);
+ assertEq(address_array[1], 0x3333333333333333333333333333333333333333);
+
+ // Read and assert bytes32 values
+ assertEq(config.get(10, "word").toBytes32(), bytes32(uint256(9999)));
+ bytes32_array = config.get(10, "word_array").toBytes32Array();
+ assertEq(bytes32_array[0], bytes32(uint256(1234)));
+ assertEq(bytes32_array[1], bytes32(uint256(5678)));
+
+ // Read and assert uint values
+ assertEq(config.get(10, "number").toUint256(), 9999);
+ uint_array = config.get(10, "number_array").toUint256Array();
+ assertEq(uint_array[0], 1234);
+ assertEq(uint_array[1], 5678);
+
+ // Read and assert int values
+ assertEq(config.get(10, "signed_number").toInt256(), 9999);
+ int_array = config.get(10, "signed_number_array").toInt256Array();
+ assertEq(int_array[0], -1234);
+ assertEq(int_array[1], -5678);
+
+ // Read and assert bytes values
+ assertEq(config.get(10, "b").toBytes(), hex"dcba");
+ bytes_array = config.get(10, "b_array").toBytesArray();
+ assertEq(bytes_array[0], hex"c0ffee");
+ assertEq(bytes_array[1], hex"babe");
+
+ // Read and assert string values
+ assertEq(config.get(10, "str").toString(), "alice");
+ string_array = config.get(10, "str_array").toStringArray();
+ assertEq(string_array[0], "bob");
+ assertEq(string_array[1], "charlie");
+ }
+
+ function test_loadConfigAndForks() public {
+ _loadConfigAndForks("./test/fixtures/config.toml", false);
+
+ // assert that the map of chain id and fork ids is created and that the chain ids actually match
+ assertEq(forkOf[1], 0);
+ vm.selectFork(forkOf[1]);
+ assertEq(vm.getChainId(), 1);
+
+ assertEq(forkOf[10], 1);
+ vm.selectFork(forkOf[10]);
+ assertEq(vm.getChainId(), 10);
+ }
+
+ function test_configExists() public {
+ _loadConfig("./test/fixtures/config.toml", false);
+
+ string[] memory keys = new string[](7);
+ keys[0] = "is_live";
+ keys[1] = "weth";
+ keys[2] = "word";
+ keys[3] = "number";
+ keys[4] = "signed_number";
+ keys[5] = "b";
+ keys[6] = "str";
+
+ // Read and assert RPC URL for Mainnet (chain ID 1)
+ assertEq(config.getRpcUrl(1), "https://reth-ethereum.ithaca.xyz/rpc");
+
+ for (uint256 i = 0; i < keys.length; ++i) {
+ assertTrue(config.exists(1, keys[i]));
+ assertFalse(config.exists(1, string.concat(keys[i], "_")));
+ }
+
+ // Assert RPC URL for Optimism (chain ID 10)
+ assertEq(config.getRpcUrl(10), "https://mainnet.optimism.io");
+
+ for (uint256 i = 0; i < keys.length; ++i) {
+ assertTrue(config.exists(10, keys[i]));
+ assertFalse(config.exists(10, string.concat(keys[i], "_")));
+ }
+ }
+
+ function test_writeConfig() public {
+ // Create a temporary copy of the config file to avoid modifying the original.
+ string memory originalConfig = "./test/fixtures/config.toml";
+ string memory testConfig = "./test/fixtures/config.t.toml";
+ vm.copyFile(originalConfig, testConfig);
+
+ // Deploy the config contract with the temporary fixture.
+ _loadConfig(testConfig, false);
+
+ // Enable writing to file bypassing the context check.
+ vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1)));
+
+ {
+ // Update a single boolean value and verify the change.
+ config.set(1, "is_live", false);
+
+ assertFalse(config.get(1, "is_live").toBool());
+
+ string memory content = vm.readFile(testConfig);
+ assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live"));
+
+ // Update a single address value and verify the change.
+ address new_addr = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF;
+ config.set(1, "weth", new_addr);
+
+ assertEq(config.get(1, "weth").toAddress(), new_addr);
+
+ content = vm.readFile(testConfig);
+ assertEq(vm.parseTomlAddress(content, "$.mainnet.address.weth"), new_addr);
+
+ // Update a uint array and verify the change.
+ uint256[] memory new_numbers = new uint256[](3);
+ new_numbers[0] = 1;
+ new_numbers[1] = 2;
+ new_numbers[2] = 3;
+ config.set(10, "number_array", new_numbers);
+
+ uint256[] memory updated_numbers_mem = config.get(10, "number_array").toUint256Array();
+ assertEq(updated_numbers_mem.length, 3);
+ assertEq(updated_numbers_mem[0], 1);
+ assertEq(updated_numbers_mem[1], 2);
+ assertEq(updated_numbers_mem[2], 3);
+
+ content = vm.readFile(testConfig);
+ uint256[] memory updated_numbers_disk = vm.parseTomlUintArray(content, "$.optimism.uint.number_array");
+ assertEq(updated_numbers_disk.length, 3);
+ assertEq(updated_numbers_disk[0], 1);
+ assertEq(updated_numbers_disk[1], 2);
+ assertEq(updated_numbers_disk[2], 3);
+
+ // Update a string array and verify the change.
+ string[] memory new_strings = new string[](2);
+ new_strings[0] = "hello";
+ new_strings[1] = "world";
+ config.set(1, "str_array", new_strings);
+
+ string[] memory updated_strings_mem = config.get(1, "str_array").toStringArray();
+ assertEq(updated_strings_mem.length, 2);
+ assertEq(updated_strings_mem[0], "hello");
+ assertEq(updated_strings_mem[1], "world");
+
+ content = vm.readFile(testConfig);
+ string[] memory updated_strings_disk = vm.parseTomlStringArray(content, "$.mainnet.string.str_array");
+ assertEq(updated_strings_disk.length, 2);
+ assertEq(updated_strings_disk[0], "hello");
+ assertEq(updated_strings_disk[1], "world");
+
+ // Create a new uint variable and verify the change.
+ config.set(1, "new_uint", uint256(42));
+
+ assertEq(config.get(1, "new_uint").toUint256(), 42);
+
+ content = vm.readFile(testConfig);
+ assertEq(vm.parseTomlUint(content, "$.mainnet.uint.new_uint"), 42);
+
+ // Create a new int variable and verify the change.
+ config.set(1, "new_int", int256(-42));
+
+ assertEq(config.get(1, "new_int").toInt256(), -42);
+
+ content = vm.readFile(testConfig);
+ assertEq(vm.parseTomlInt(content, "$.mainnet.int.new_int"), -42);
+
+ // Create a new int array and verify the change.
+ int256[] memory new_ints = new int256[](2);
+ new_ints[0] = -100;
+ new_ints[1] = 200;
+ config.set(10, "new_ints", new_ints);
+
+ int256[] memory updated_ints_mem = config.get(10, "new_ints").toInt256Array();
+ assertEq(updated_ints_mem.length, 2);
+ assertEq(updated_ints_mem[0], -100);
+ assertEq(updated_ints_mem[1], 200);
+
+ content = vm.readFile(testConfig);
+ int256[] memory updated_ints_disk = vm.parseTomlIntArray(content, "$.optimism.int.new_ints");
+ assertEq(updated_ints_disk.length, 2);
+ assertEq(updated_ints_disk[0], -100);
+ assertEq(updated_ints_disk[1], 200);
+
+ // Create a new bytes32 array and verify the change.
+ bytes32[] memory new_words = new bytes32[](2);
+ new_words[0] = bytes32(uint256(0xDEAD));
+ new_words[1] = bytes32(uint256(0xBEEF));
+ config.set(10, "new_words", new_words);
+
+ bytes32[] memory updated_words_mem = config.get(10, "new_words").toBytes32Array();
+ assertEq(updated_words_mem.length, 2);
+ assertEq(updated_words_mem[0], new_words[0]);
+ assertEq(updated_words_mem[1], new_words[1]);
+
+ content = vm.readFile(testConfig);
+ bytes32[] memory updated_words_disk = vm.parseTomlBytes32Array(content, "$.optimism.bytes32.new_words");
+ assertEq(updated_words_disk.length, 2);
+ assertEq(vm.toString(updated_words_disk[0]), vm.toString(new_words[0]));
+ assertEq(vm.toString(updated_words_disk[1]), vm.toString(new_words[1]));
+ }
+
+ // Clean up the temporary file.
+ vm.removeFile(testConfig);
+ }
+
+ function test_writeUpdatesBackToFile() public {
+ // Create a temporary copy of the config file to avoid modifying the original.
+ string memory originalConfig = "./test/fixtures/config.toml";
+ string memory testConfig = "./test/fixtures/write_config.t.toml";
+ vm.copyFile(originalConfig, testConfig);
+
+ // Deploy the config contract with `writeToFile = false` (disabled).
+ _loadConfig(testConfig, false);
+
+ // Update a single boolean value and verify the file is NOT changed.
+ config.set(1, "is_live", false);
+ string memory content = vm.readFile(testConfig);
+ assertTrue(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should not be updated yet");
+
+ // Enable writing to file bypassing the context check.
+ vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1)));
+
+ // Update the value again and verify the file IS changed.
+ config.set(1, "is_live", false);
+ content = vm.readFile(testConfig);
+ assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should be updated now");
+
+ // Disable writing to file.
+ config.writeUpdatesBackToFile(false);
+
+ // Update the value again and verify the file is NOT changed.
+ config.set(1, "is_live", true);
+ content = vm.readFile(testConfig);
+ assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should not be updated again");
+
+ // Clean up the temporary file.
+ vm.removeFile(testConfig);
+ }
+
+ function testRevert_WriteToFileInForbiddenCtxt() public {
+ // Cannot initialize enabling writing to file unless we are in SCRIPT mode.
+ vm.expectRevert(StdConfig.WriteToFileInForbiddenCtxt.selector);
+ _loadConfig("./test/fixtures/config.toml", true);
+
+ // Initialize with `writeToFile = false`.
+ _loadConfig("./test/fixtures/config.toml", false);
+
+ // Cannot enable writing to file unless we are in SCRIPT mode.
+ vm.expectRevert(StdConfig.WriteToFileInForbiddenCtxt.selector);
+ config.writeUpdatesBackToFile(true);
+ }
+
+ function testRevert_InvalidChainKey() public {
+ // Create a fixture with an invalid chain key
+ string memory invalidChainConfig = "./test/fixtures/config_invalid_chain.toml";
+ vm.writeFile(
+ invalidChainConfig,
+ string.concat(
+ "[mainnet]\n",
+ "endpoint_url = \"https://reth-ethereum.ithaca.xyz/rpc\"\n",
+ "\n",
+ "[mainnet.uint]\n",
+ "valid_number = 123\n",
+ "\n",
+ "# Invalid chain key (not a number and not a valid alias)\n",
+ "[invalid_chain]\n",
+ "endpoint_url = \"https://invalid.com\"\n",
+ "\n",
+ "[invalid_chain_9999.uint]\n",
+ "some_value = 456\n"
+ )
+ );
+
+ vm.expectRevert(abi.encodeWithSelector(StdConfig.InvalidChainKey.selector, "invalid_chain"));
+ new StdConfig(invalidChainConfig, false);
+ vm.removeFile(invalidChainConfig);
+ }
+
+ function testRevert_ChainNotInitialized() public {
+ _loadConfig("./test/fixtures/config.toml", false);
+
+ // Enable writing to file bypassing the context check.
+ vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1)));
+
+ // Try to write a value for a non-existent chain ID
+ vm.expectRevert(abi.encodeWithSelector(StdConfig.ChainNotInitialized.selector, uint256(999999)));
+ config.set(999999, "some_key", uint256(123));
+ }
+
+ function testRevert_UnableToParseVariable() public {
+ // Create a temporary fixture with an unparsable variable
+ string memory badParseConfig = "./test/fixtures/config_bad_parse.toml";
+ vm.writeFile(
+ badParseConfig,
+ string.concat(
+ "[mainnet]\n",
+ "endpoint_url = \"https://reth-ethereum.ithaca.xyz/rpc\"\n",
+ "\n",
+ "[mainnet.uint]\n",
+ "bad_value = \"not_a_number\"\n"
+ )
+ );
+
+ vm.expectRevert(abi.encodeWithSelector(StdConfig.UnableToParseVariable.selector, "bad_value"));
+ new StdConfig(badParseConfig, false);
+ vm.removeFile(badParseConfig);
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/LibVariable.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/LibVariable.t.sol
new file mode 100644
index 000000000..abd515cc4
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/LibVariable.t.sol
@@ -0,0 +1,452 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity ^0.8.13;
+
+import {Test} from "../src/Test.sol";
+import {Variable, Type, TypeKind, LibVariable} from "../src/LibVariable.sol";
+
+contract LibVariableTest is Test {
+ using LibVariable for Type;
+ using LibVariable for TypeKind;
+
+ LibVariableHelper internal helper;
+
+ bytes internal expectedErr;
+ Variable internal uninitVar;
+ Variable internal boolVar;
+ Variable internal addressVar;
+ Variable internal bytes32Var;
+ Variable internal uintVar;
+ Variable internal intVar;
+ Variable internal stringVar;
+ Variable internal bytesVar;
+ Variable internal boolArrayVar;
+ Variable internal addressArrayVar;
+ Variable internal bytes32ArrayVar;
+ Variable internal uintArrayVar;
+ Variable internal intArrayVar;
+ Variable internal stringArrayVar;
+ Variable internal bytesArrayVar;
+
+ function setUp() public {
+ helper = new LibVariableHelper();
+
+ // UNINITIALIZED
+ uninitVar = Variable(Type(TypeKind.None, false), "");
+
+ // SINGLE VALUES
+ boolVar = Variable(Type(TypeKind.Bool, false), abi.encode(true));
+ addressVar = Variable(Type(TypeKind.Address, false), abi.encode(address(0xdeadbeef)));
+ bytes32Var = Variable(Type(TypeKind.Bytes32, false), abi.encode(bytes32(uint256(42))));
+ uintVar = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(123)));
+ intVar = Variable(Type(TypeKind.Int256, false), abi.encode(int256(-123)));
+ stringVar = Variable(Type(TypeKind.String, false), abi.encode("hello world"));
+ bytesVar = Variable(Type(TypeKind.Bytes, false), abi.encode(hex"c0ffee"));
+
+ // ARRAY VALUES
+ bool[] memory bools = new bool[](2);
+ bools[0] = true;
+ bools[1] = false;
+ boolArrayVar = Variable(Type(TypeKind.Bool, true), abi.encode(bools));
+
+ address[] memory addrs = new address[](2);
+ addrs[0] = address(0x1);
+ addrs[1] = address(0x2);
+ addressArrayVar = Variable(Type(TypeKind.Address, true), abi.encode(addrs));
+
+ bytes32[] memory b32s = new bytes32[](2);
+ b32s[0] = bytes32(uint256(1));
+ b32s[1] = bytes32(uint256(2));
+ bytes32ArrayVar = Variable(Type(TypeKind.Bytes32, true), abi.encode(b32s));
+
+ uint256[] memory uints = new uint256[](2);
+ uints[0] = 1;
+ uints[1] = 2;
+ uintArrayVar = Variable(Type(TypeKind.Uint256, true), abi.encode(uints));
+
+ int256[] memory ints = new int256[](2);
+ ints[0] = -1;
+ ints[1] = 2;
+ intArrayVar = Variable(Type(TypeKind.Int256, true), abi.encode(ints));
+
+ string[] memory strings = new string[](2);
+ strings[0] = "one";
+ strings[1] = "two";
+ stringArrayVar = Variable(Type(TypeKind.String, true), abi.encode(strings));
+
+ bytes[] memory b = new bytes[](2);
+ b[0] = hex"01";
+ b[1] = hex"02";
+ bytesArrayVar = Variable(Type(TypeKind.Bytes, true), abi.encode(b));
+ }
+
+ // -- SUCCESS CASES --------------------------------------------------------
+
+ function test_TypeHelpers() public view {
+ // TypeKind.toString()
+ assertEq(TypeKind.None.toString(), "none");
+ assertEq(TypeKind.Bool.toString(), "bool");
+ assertEq(TypeKind.Address.toString(), "address");
+ assertEq(TypeKind.Bytes32.toString(), "bytes32");
+ assertEq(TypeKind.Uint256.toString(), "uint256");
+ assertEq(TypeKind.Int256.toString(), "int256");
+ assertEq(TypeKind.String.toString(), "string");
+ assertEq(TypeKind.Bytes.toString(), "bytes");
+
+ // TypeKind.toTomlKey()
+ assertEq(TypeKind.Uint256.toTomlKey(), "uint");
+ assertEq(TypeKind.Int256.toTomlKey(), "int");
+ assertEq(TypeKind.Bytes32.toTomlKey(), "bytes32");
+
+ // Type.toString()
+ assertEq(boolVar.ty.toString(), "bool");
+ assertEq(boolArrayVar.ty.toString(), "bool[]");
+ assertEq(uintVar.ty.toString(), "uint256");
+ assertEq(uintArrayVar.ty.toString(), "uint256[]");
+ assertEq(uninitVar.ty.toString(), "none");
+
+ // Type.isEqual()
+ assertTrue(boolVar.ty.isEqual(Type(TypeKind.Bool, false)));
+ assertFalse(boolVar.ty.isEqual(Type(TypeKind.Bool, true)));
+ assertFalse(boolVar.ty.isEqual(Type(TypeKind.Address, false)));
+
+ // Type.assertEq()
+ boolVar.ty.assertEq(Type(TypeKind.Bool, false));
+ uintArrayVar.ty.assertEq(Type(TypeKind.Uint256, true));
+ }
+
+ function test_Coercion() public view {
+ // Single values
+ assertTrue(helper.toBool(boolVar));
+ assertEq(helper.toAddress(addressVar), address(0xdeadbeef));
+ assertEq(helper.toBytes32(bytes32Var), bytes32(uint256(42)));
+ assertEq(helper.toUint256(uintVar), 123);
+ assertEq(helper.toInt256(intVar), -123);
+ assertEq(helper.toString(stringVar), "hello world");
+ assertEq(helper.toBytes(bytesVar), hex"c0ffee");
+
+ // Bool array
+ bool[] memory bools = helper.toBoolArray(boolArrayVar);
+ assertEq(bools.length, 2);
+ assertTrue(bools[0]);
+ assertFalse(bools[1]);
+
+ // Address array
+ address[] memory addrs = helper.toAddressArray(addressArrayVar);
+ assertEq(addrs.length, 2);
+ assertEq(addrs[0], address(0x1));
+ assertEq(addrs[1], address(0x2));
+
+ // String array
+ string[] memory strings = helper.toStringArray(stringArrayVar);
+ assertEq(strings.length, 2);
+ assertEq(strings[0], "one");
+ assertEq(strings[1], "two");
+
+ // Bytes32 array
+ bytes32[] memory b32s = helper.toBytes32Array(bytes32ArrayVar);
+ assertEq(b32s.length, 2);
+ assertEq(b32s[0], bytes32(uint256(1)));
+ assertEq(b32s[1], bytes32(uint256(2)));
+
+ // Int array
+ int256[] memory ints = helper.toInt256Array(intArrayVar);
+ assertEq(ints.length, 2);
+ assertEq(ints[0], -1);
+ assertEq(ints[1], 2);
+
+ // Bytes array
+ bytes[] memory b = helper.toBytesArray(bytesArrayVar);
+ assertEq(b.length, 2);
+ assertEq(b[0], hex"01");
+ assertEq(b[1], hex"02");
+ }
+
+ function test_Downcasting() public view {
+ // Uint downcasting
+ Variable memory v_uint_small = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(100)));
+ assertEq(helper.toUint128(v_uint_small), 100);
+ assertEq(helper.toUint64(v_uint_small), 100);
+ assertEq(helper.toUint32(v_uint_small), 100);
+ assertEq(helper.toUint16(v_uint_small), 100);
+ assertEq(helper.toUint8(v_uint_small), 100);
+
+ // Uint array downcasting
+ uint256[] memory small_uints = new uint256[](2);
+ small_uints[0] = 10;
+ small_uints[1] = 20;
+ Variable memory v_uint_array_small = Variable(Type(TypeKind.Uint256, true), abi.encode(small_uints));
+ uint8[] memory u8_array = helper.toUint8Array(v_uint_array_small);
+ assertEq(u8_array[0], 10);
+ assertEq(u8_array[1], 20);
+
+ // Int downcasting
+ Variable memory v_int_small_pos = Variable(Type(TypeKind.Int256, false), abi.encode(int256(100)));
+ Variable memory v_int_small_neg = Variable(Type(TypeKind.Int256, false), abi.encode(int256(-100)));
+ assertEq(helper.toInt128(v_int_small_pos), 100);
+ assertEq(helper.toInt64(v_int_small_neg), -100);
+ assertEq(helper.toInt32(v_int_small_pos), 100);
+ assertEq(helper.toInt16(v_int_small_neg), -100);
+ assertEq(helper.toInt8(v_int_small_pos), 100);
+
+ // Int array downcasting
+ int256[] memory small_ints = new int256[](2);
+ small_ints[0] = -10;
+ small_ints[1] = 20;
+ Variable memory intArraySmall = Variable(Type(TypeKind.Int256, true), abi.encode(small_ints));
+ int8[] memory i8_array = helper.toInt8Array(intArraySmall);
+ assertEq(i8_array[0], -10);
+ assertEq(i8_array[1], 20);
+ }
+
+ // -- REVERT CASES ---------------------------------------------------------
+
+ function testRevert_NotInitialized() public {
+ vm.expectRevert(LibVariable.NotInitialized.selector);
+ helper.toBool(uninitVar);
+
+ vm.expectRevert(LibVariable.NotInitialized.selector);
+ helper.toAddressArray(uninitVar);
+ }
+
+ function testRevert_assertExists() public {
+ vm.expectRevert(LibVariable.NotInitialized.selector);
+ helper.assertExists(uninitVar);
+ }
+
+ function testRevert_TypeMismatch() public {
+ // Single values
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256", "bool"));
+ helper.toUint256(boolVar);
+
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "address", "string"));
+ helper.toAddress(stringVar);
+
+ // Arrays
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256[]", "bool[]"));
+ helper.toUint256Array(boolArrayVar);
+
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "address[]", "string[]"));
+ helper.toAddressArray(stringArrayVar);
+
+ // Single value to array
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "bool[]", "bool"));
+ helper.toBoolArray(boolVar);
+
+ // Array to single value
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "bool", "bool[]"));
+ helper.toBool(boolArrayVar);
+
+ // assertEq reverts
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256", "bool"));
+ helper.assertEq(boolVar.ty, Type(TypeKind.Uint256, false));
+ }
+
+ function testRevert_UnsafeCast() public {
+ // uint overflow
+ Variable memory uintLarge = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(type(uint128).max) + 1));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'uint128'");
+ vm.expectRevert(expectedErr);
+ helper.toUint128(uintLarge);
+
+ // int overflow
+ Variable memory intLarge = Variable(Type(TypeKind.Int256, false), abi.encode(int256(type(int128).max) + 1));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'int128'");
+
+ vm.expectRevert(expectedErr);
+ helper.toInt128(intLarge);
+
+ // int underflow
+ Variable memory intSmall = Variable(Type(TypeKind.Int256, false), abi.encode(int256(type(int128).min) - 1));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'int128'");
+
+ vm.expectRevert(expectedErr);
+ helper.toInt128(intSmall);
+
+ // uint array overflow
+ uint256[] memory uintArray = new uint256[](2);
+ uintArray[0] = 10;
+ uintArray[1] = uint256(type(uint64).max) + 1;
+ Variable memory uintArrayLarge = Variable(Type(TypeKind.Uint256, true), abi.encode(uintArray));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'uint64'");
+
+ vm.expectRevert(expectedErr);
+ helper.toUint64Array(uintArrayLarge);
+
+ // int array overflow
+ int256[] memory intArray = new int256[](2);
+ intArray[0] = 10;
+ intArray[1] = int256(type(int64).max) + 1;
+ Variable memory intArrayLarge = Variable(Type(TypeKind.Int256, true), abi.encode(intArray));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'int64'");
+
+ vm.expectRevert(expectedErr);
+ helper.toInt64Array(intArrayLarge);
+
+ // int array underflow
+ intArray[0] = 10;
+ intArray[1] = int256(type(int64).min) - 1;
+ Variable memory intArraySmall = Variable(Type(TypeKind.Int256, true), abi.encode(intArray));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'int64'");
+
+ vm.expectRevert(expectedErr);
+ helper.toInt64Array(intArraySmall);
+ }
+}
+
+/// @dev We must use an external helper contract to ensure proper call depth for `vm.expectRevert`,
+/// as direct library calls are inlined by the compiler, causing call depth issues.
+contract LibVariableHelper {
+ using LibVariable for Type;
+ using LibVariable for TypeKind;
+
+ // Assertions
+ function assertExists(Variable memory v) external pure {
+ v.assertExists();
+ }
+
+ function assertEq(Type memory t1, Type memory t2) external pure {
+ t1.assertEq(t2);
+ }
+
+ // Single Value Coercion
+ function toBool(Variable memory v) external pure returns (bool) {
+ return v.toBool();
+ }
+
+ function toAddress(Variable memory v) external pure returns (address) {
+ return v.toAddress();
+ }
+
+ function toBytes32(Variable memory v) external pure returns (bytes32) {
+ return v.toBytes32();
+ }
+
+ function toUint256(Variable memory v) external pure returns (uint256) {
+ return v.toUint256();
+ }
+
+ function toInt256(Variable memory v) external pure returns (int256) {
+ return v.toInt256();
+ }
+
+ function toString(Variable memory v) external pure returns (string memory) {
+ return v.toString();
+ }
+
+ function toBytes(Variable memory v) external pure returns (bytes memory) {
+ return v.toBytes();
+ }
+
+ // Array Coercion
+ function toBoolArray(Variable memory v) external pure returns (bool[] memory) {
+ return v.toBoolArray();
+ }
+
+ function toAddressArray(Variable memory v) external pure returns (address[] memory) {
+ return v.toAddressArray();
+ }
+
+ function toBytes32Array(Variable memory v) external pure returns (bytes32[] memory) {
+ return v.toBytes32Array();
+ }
+
+ function toUint256Array(Variable memory v) external pure returns (uint256[] memory) {
+ return v.toUint256Array();
+ }
+
+ function toInt256Array(Variable memory v) external pure returns (int256[] memory) {
+ return v.toInt256Array();
+ }
+
+ function toStringArray(Variable memory v) external pure returns (string[] memory) {
+ return v.toStringArray();
+ }
+
+ function toBytesArray(Variable memory v) external pure returns (bytes[] memory) {
+ return v.toBytesArray();
+ }
+
+ // Uint Downcasting
+ function toUint128(Variable memory v) external pure returns (uint128) {
+ return v.toUint128();
+ }
+
+ function toUint64(Variable memory v) external pure returns (uint64) {
+ return v.toUint64();
+ }
+
+ function toUint32(Variable memory v) external pure returns (uint32) {
+ return v.toUint32();
+ }
+
+ function toUint16(Variable memory v) external pure returns (uint16) {
+ return v.toUint16();
+ }
+
+ function toUint8(Variable memory v) external pure returns (uint8) {
+ return v.toUint8();
+ }
+
+ // Int Downcasting
+ function toInt128(Variable memory v) external pure returns (int128) {
+ return v.toInt128();
+ }
+
+ function toInt64(Variable memory v) external pure returns (int64) {
+ return v.toInt64();
+ }
+
+ function toInt32(Variable memory v) external pure returns (int32) {
+ return v.toInt32();
+ }
+
+ function toInt16(Variable memory v) external pure returns (int16) {
+ return v.toInt16();
+ }
+
+ function toInt8(Variable memory v) external pure returns (int8) {
+ return v.toInt8();
+ }
+
+ // Uint Array Downcasting
+ function toUint128Array(Variable memory v) external pure returns (uint128[] memory) {
+ return v.toUint128Array();
+ }
+
+ function toUint64Array(Variable memory v) external pure returns (uint64[] memory) {
+ return v.toUint64Array();
+ }
+
+ function toUint32Array(Variable memory v) external pure returns (uint32[] memory) {
+ return v.toUint32Array();
+ }
+
+ function toUint16Array(Variable memory v) external pure returns (uint16[] memory) {
+ return v.toUint16Array();
+ }
+
+ function toUint8Array(Variable memory v) external pure returns (uint8[] memory) {
+ return v.toUint8Array();
+ }
+
+ // Int Array Downcasting
+ function toInt128Array(Variable memory v) external pure returns (int128[] memory) {
+ return v.toInt128Array();
+ }
+
+ function toInt64Array(Variable memory v) external pure returns (int64[] memory) {
+ return v.toInt64Array();
+ }
+
+ function toInt32Array(Variable memory v) external pure returns (int32[] memory) {
+ return v.toInt32Array();
+ }
+
+ function toInt16Array(Variable memory v) external pure returns (int16[] memory) {
+ return v.toInt16Array();
+ }
+
+ function toInt8Array(Variable memory v) external pure returns (int8[] memory) {
+ return v.toInt8Array();
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdAssertions.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdAssertions.t.sol
new file mode 100644
index 000000000..3d670cb7e
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdAssertions.t.sol
@@ -0,0 +1,141 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {StdAssertions} from "../src/StdAssertions.sol";
+import {Vm} from "../src/Vm.sol";
+
+interface VmInternal is Vm {
+ function _expectCheatcodeRevert(bytes memory message) external;
+}
+
+contract StdAssertionsTest is StdAssertions {
+ string constant errorMessage = "User provided message";
+ uint256 constant maxDecimals = 77;
+
+ bool constant SHOULD_REVERT = true;
+ bool constant SHOULD_RETURN = false;
+
+ bool constant STRICT_REVERT_DATA = true;
+ bool constant NON_STRICT_REVERT_DATA = false;
+
+ VmInternal constant vm = VmInternal(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function testFuzz_AssertEqCall_Return_Pass(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnData,
+ bool strictRevertData
+ ) external {
+ address targetA = address(new TestMockCall(returnData, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnData, SHOULD_RETURN));
+
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Return_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnDataA,
+ bytes memory returnDataB,
+ bool strictRevertData
+ ) external {
+ vm.assume(keccak256(returnDataA) != keccak256(returnDataB));
+
+ address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN));
+
+ vm._expectCheatcodeRevert(
+ bytes(
+ string.concat(
+ "Call return data does not match: ", vm.toString(returnDataA), " != ", vm.toString(returnDataB)
+ )
+ )
+ );
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+
+ function testFuzz_AssertEqCall_Revert_Pass(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory revertDataA,
+ bytes memory revertDataB
+ ) external {
+ address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT));
+ address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT));
+
+ assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Revert_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory revertDataA,
+ bytes memory revertDataB
+ ) external {
+ vm.assume(keccak256(revertDataA) != keccak256(revertDataB));
+
+ address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT));
+ address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT));
+
+ vm._expectCheatcodeRevert(
+ bytes(
+ string.concat(
+ "Call revert data does not match: ", vm.toString(revertDataA), " != ", vm.toString(revertDataB)
+ )
+ )
+ );
+ assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnDataA,
+ bytes memory returnDataB,
+ bool strictRevertData
+ ) external {
+ address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT));
+
+ vm.expectRevert(bytes("assertion failed"));
+ this.assertEqCallExternal(targetA, callDataA, targetB, callDataB, strictRevertData);
+
+ vm.expectRevert(bytes("assertion failed"));
+ this.assertEqCallExternal(targetB, callDataB, targetA, callDataA, strictRevertData);
+ }
+
+ // Helper function to test outcome of assertEqCall via `expect` cheatcodes
+ function assertEqCallExternal(
+ address targetA,
+ bytes memory callDataA,
+ address targetB,
+ bytes memory callDataB,
+ bool strictRevertData
+ ) public {
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+}
+
+contract TestMockCall {
+ bytes returnData;
+ bool shouldRevert;
+
+ constructor(bytes memory returnData_, bool shouldRevert_) {
+ returnData = returnData_;
+ shouldRevert = shouldRevert_;
+ }
+
+ fallback() external payable {
+ bytes memory returnData_ = returnData;
+
+ if (shouldRevert) {
+ assembly {
+ revert(add(returnData_, 0x20), mload(returnData_))
+ }
+ } else {
+ assembly {
+ return(add(returnData_, 0x20), mload(returnData_))
+ }
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdChains.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdChains.t.sol
new file mode 100644
index 000000000..8894f4b15
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdChains.t.sol
@@ -0,0 +1,227 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Test} from "../src/Test.sol";
+
+contract StdChainsMock is Test {
+ function exposedGetChain(string memory chainAlias) public returns (Chain memory) {
+ return getChain(chainAlias);
+ }
+
+ function exposedGetChain(uint256 chainId) public returns (Chain memory) {
+ return getChain(chainId);
+ }
+
+ function exposedSetChain(string memory chainAlias, ChainData memory chainData) public {
+ setChain(chainAlias, chainData);
+ }
+
+ function exposedSetFallbackToDefaultRpcUrls(bool useDefault) public {
+ setFallbackToDefaultRpcUrls(useDefault);
+ }
+}
+
+contract StdChainsTest is Test {
+ function test_ChainRpcInitialization() public {
+ // RPCs specified in `foundry.toml` should be updated.
+ assertEq(getChain(1).rpcUrl, "https://reth-ethereum.ithaca.xyz/rpc");
+ assertEq(getChain("optimism_sepolia").rpcUrl, "https://sepolia.optimism.io/");
+ assertEq(getChain("arbitrum_one_sepolia").rpcUrl, "https://sepolia-rollup.arbitrum.io/rpc/");
+
+ // Environment variables should be the next fallback
+ assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc");
+ vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride");
+ assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride");
+ vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc");
+
+ // Cannot override RPCs defined in `foundry.toml`
+ vm.setEnv("MAINNET_RPC_URL", "myoverride2");
+ assertEq(getChain("mainnet").rpcUrl, "https://reth-ethereum.ithaca.xyz/rpc");
+
+ // Other RPCs should remain unchanged.
+ assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545");
+ assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001");
+ }
+
+ // Named with a leading underscore to clarify this is not intended to be run as a normal test,
+ // and is intended to be used in the below `test_Rpcs` test.
+ function _testRpc(string memory rpcAlias) internal {
+ string memory rpcUrl = getChain(rpcAlias).rpcUrl;
+ vm.createSelectFork(rpcUrl);
+ }
+
+ // Ensure we can connect to the default RPC URL for each chain.
+ // Currently commented out since this is slow and public RPCs are flaky, often resulting in failing CI.
+ // function test_Rpcs() public {
+ // _testRpc("mainnet");
+ // _testRpc("sepolia");
+ // _testRpc("holesky");
+ // _testRpc("optimism");
+ // _testRpc("optimism_sepolia");
+ // _testRpc("arbitrum_one");
+ // _testRpc("arbitrum_one_sepolia");
+ // _testRpc("arbitrum_nova");
+ // _testRpc("polygon");
+ // _testRpc("polygon_amoy");
+ // _testRpc("avalanche");
+ // _testRpc("avalanche_fuji");
+ // _testRpc("bnb_smart_chain");
+ // _testRpc("bnb_smart_chain_testnet");
+ // _testRpc("gnosis_chain");
+ // _testRpc("moonbeam");
+ // _testRpc("moonriver");
+ // _testRpc("moonbase");
+ // _testRpc("base_sepolia");
+ // _testRpc("base");
+ // _testRpc("blast_sepolia");
+ // _testRpc("blast");
+ // _testRpc("fantom_opera");
+ // _testRpc("fantom_opera_testnet");
+ // _testRpc("fraxtal");
+ // _testRpc("fraxtal_testnet");
+ // _testRpc("berachain_bartio_testnet");
+ // _testRpc("flare");
+ // _testRpc("flare_coston2");
+ // }
+
+ function test_RevertIf_ChainNotFound() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found.");
+ stdChainsMock.exposedGetChain("does_not_exist");
+ }
+
+ function test_RevertIf_SetChain_ChainIdExist_FirstTest() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\".");
+ stdChainsMock.exposedSetChain("anvil2", ChainData("Anvil", 31337, "URL"));
+ }
+
+ function test_RevertIf_ChainBubbleUp() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ stdChainsMock.exposedSetChain("needs_undefined_env_var", ChainData("", 123456789, ""));
+ // Forge environment variable error.
+ vm.expectRevert();
+ stdChainsMock.exposedGetChain("needs_undefined_env_var");
+ }
+
+ function test_RevertIf_SetChain_ChainIdExists_SecondTest() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ stdChainsMock.exposedSetChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+
+ vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".');
+
+ stdChainsMock.exposedSetChain("another_custom_chain", ChainData("", 123456789, ""));
+ }
+
+ function test_SetChain() public {
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+ Chain memory customChain = getChain("custom_chain");
+ assertEq(customChain.name, "Custom Chain");
+ assertEq(customChain.chainId, 123456789);
+ assertEq(customChain.chainAlias, "custom_chain");
+ assertEq(customChain.rpcUrl, "https://custom.chain/");
+ Chain memory chainById = getChain(123456789);
+ assertEq(chainById.name, customChain.name);
+ assertEq(chainById.chainId, customChain.chainId);
+ assertEq(chainById.chainAlias, customChain.chainAlias);
+ assertEq(chainById.rpcUrl, customChain.rpcUrl);
+ customChain.name = "Another Custom Chain";
+ customChain.chainId = 987654321;
+ setChain("another_custom_chain", customChain);
+ Chain memory anotherCustomChain = getChain("another_custom_chain");
+ assertEq(anotherCustomChain.name, "Another Custom Chain");
+ assertEq(anotherCustomChain.chainId, 987654321);
+ assertEq(anotherCustomChain.chainAlias, "another_custom_chain");
+ assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/");
+ // Verify the first chain data was not overwritten
+ chainById = getChain(123456789);
+ assertEq(chainById.name, "Custom Chain");
+ assertEq(chainById.chainId, 123456789);
+ }
+
+ function test_RevertIf_SetEmptyAlias() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string.");
+ stdChainsMock.exposedSetChain("", ChainData("", 123456789, ""));
+ }
+
+ function test_RevertIf_SetNoChainId0() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0.");
+ stdChainsMock.exposedSetChain("alias", ChainData("", 0, ""));
+ }
+
+ function test_RevertIf_GetNoChainId0() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0.");
+ stdChainsMock.exposedGetChain(0);
+ }
+
+ function test_RevertIf_GetNoEmptyAlias() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string.");
+ stdChainsMock.exposedGetChain("");
+ }
+
+ function test_RevertIf_ChainNotInitialized() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found.");
+ stdChainsMock.exposedGetChain("no_such_alias");
+ }
+
+ function test_RevertIf_ChainAliasNotFound() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found.");
+
+ stdChainsMock.exposedGetChain(321);
+ }
+
+ function test_SetChain_ExistingOne() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+ assertEq(getChain(123456789).chainId, 123456789);
+
+ setChain("custom_chain", ChainData("Modified Chain", 9999999999999999999, "https://modified.chain/"));
+ vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found.");
+ stdChainsMock.exposedGetChain(123456789);
+
+ Chain memory modifiedChain = getChain(9999999999999999999);
+ assertEq(modifiedChain.name, "Modified Chain");
+ assertEq(modifiedChain.chainId, 9999999999999999999);
+ assertEq(modifiedChain.rpcUrl, "https://modified.chain/");
+ }
+
+ function test_RevertIf_DontUseDefaultRpcUrl() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ // Should error if default RPCs flag is set to false.
+ stdChainsMock.exposedSetFallbackToDefaultRpcUrls(false);
+ vm.expectRevert();
+ stdChainsMock.exposedGetChain(31337);
+ vm.expectRevert();
+ stdChainsMock.exposedGetChain("sepolia");
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdCheats.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdCheats.t.sol
new file mode 100644
index 000000000..33c819a68
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdCheats.t.sol
@@ -0,0 +1,638 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {StdCheats} from "../src/StdCheats.sol";
+import {Test} from "../src/Test.sol";
+import {stdJson} from "../src/StdJson.sol";
+import {stdToml} from "../src/StdToml.sol";
+import {IERC20} from "../src/interfaces/IERC20.sol";
+
+contract StdCheatsTest is Test {
+ Bar test;
+
+ using stdJson for string;
+
+ function setUp() public {
+ test = new Bar();
+ }
+
+ function test_Skip() public {
+ vm.warp(100);
+ skip(25);
+ assertEq(block.timestamp, 125);
+ }
+
+ function test_Rewind() public {
+ vm.warp(100);
+ rewind(25);
+ assertEq(block.timestamp, 75);
+ }
+
+ function test_Hoax() public {
+ hoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ }
+
+ function test_HoaxOrigin() public {
+ hoax(address(1337), address(1337));
+ test.origin{value: 100}(address(1337));
+ }
+
+ function test_HoaxDifferentAddresses() public {
+ hoax(address(1337), address(7331));
+ test.origin{value: 100}(address(1337), address(7331));
+ }
+
+ function test_StartHoax() public {
+ startHoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ test.bar{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+
+ function test_StartHoaxOrigin() public {
+ startHoax(address(1337), address(1337));
+ test.origin{value: 100}(address(1337));
+ test.origin{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+
+ function test_ChangePrankMsgSender() public {
+ vm.startPrank(address(1337));
+ test.bar(address(1337));
+ changePrank(address(0xdead));
+ test.bar(address(0xdead));
+ changePrank(address(1337));
+ test.bar(address(1337));
+ vm.stopPrank();
+ }
+
+ function test_ChangePrankMsgSenderAndTxOrigin() public {
+ vm.startPrank(address(1337), address(1338));
+ test.origin(address(1337), address(1338));
+ changePrank(address(0xdead), address(0xbeef));
+ test.origin(address(0xdead), address(0xbeef));
+ changePrank(address(1337), address(1338));
+ test.origin(address(1337), address(1338));
+ vm.stopPrank();
+ }
+
+ function test_MakeAccountEquivalence() public {
+ Account memory account = makeAccount("1337");
+ (address addr, uint256 key) = makeAddrAndKey("1337");
+ assertEq(account.addr, addr);
+ assertEq(account.key, key);
+ }
+
+ function test_MakeAddrEquivalence() public {
+ (address addr,) = makeAddrAndKey("1337");
+ assertEq(makeAddr("1337"), addr);
+ }
+
+ function test_MakeAddrSigning() public {
+ (address addr, uint256 key) = makeAddrAndKey("1337");
+ bytes32 hash = keccak256("some_message");
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash);
+ assertEq(ecrecover(hash, v, r, s), addr);
+ }
+
+ function test_Deal() public {
+ deal(address(this), 1 ether);
+ assertEq(address(this).balance, 1 ether);
+ }
+
+ function test_DealToken() public {
+ Bar barToken = new Bar();
+ address bar = address(barToken);
+ deal(bar, address(this), 10000e18);
+ assertEq(barToken.balanceOf(address(this)), 10000e18);
+ }
+
+ function test_DealTokenAdjustTotalSupply() public {
+ Bar barToken = new Bar();
+ address bar = address(barToken);
+ deal(bar, address(this), 10000e18, true);
+ assertEq(barToken.balanceOf(address(this)), 10000e18);
+ assertEq(barToken.totalSupply(), 20000e18);
+ deal(bar, address(this), 0, true);
+ assertEq(barToken.balanceOf(address(this)), 0);
+ assertEq(barToken.totalSupply(), 10000e18);
+ }
+
+ function test_DealERC1155Token() public {
+ BarERC1155 barToken = new BarERC1155();
+ address bar = address(barToken);
+ dealERC1155(bar, address(this), 0, 10000e18, false);
+ assertEq(barToken.balanceOf(address(this), 0), 10000e18);
+ }
+
+ function test_DealERC1155TokenAdjustTotalSupply() public {
+ BarERC1155 barToken = new BarERC1155();
+ address bar = address(barToken);
+ dealERC1155(bar, address(this), 0, 10000e18, true);
+ assertEq(barToken.balanceOf(address(this), 0), 10000e18);
+ assertEq(barToken.totalSupply(0), 20000e18);
+ dealERC1155(bar, address(this), 0, 0, true);
+ assertEq(barToken.balanceOf(address(this), 0), 0);
+ assertEq(barToken.totalSupply(0), 10000e18);
+ }
+
+ function test_DealERC721Token() public {
+ BarERC721 barToken = new BarERC721();
+ address bar = address(barToken);
+ dealERC721(bar, address(2), 1);
+ assertEq(barToken.balanceOf(address(2)), 1);
+ assertEq(barToken.balanceOf(address(1)), 0);
+ dealERC721(bar, address(1), 2);
+ assertEq(barToken.balanceOf(address(1)), 1);
+ assertEq(barToken.balanceOf(bar), 1);
+ }
+
+ function test_DeployCode() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""));
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ }
+
+ function test_DestroyAccount() public {
+ // deploy something to destroy it
+ BarERC721 barToken = new BarERC721();
+ address bar = address(barToken);
+ vm.setNonce(bar, 10);
+ deal(bar, 100);
+
+ uint256 prevThisBalance = address(this).balance;
+ uint256 size;
+ assembly {
+ size := extcodesize(bar)
+ }
+
+ assertGt(size, 0);
+ assertEq(bar.balance, 100);
+ assertEq(vm.getNonce(bar), 10);
+
+ destroyAccount(bar, address(this));
+ assembly {
+ size := extcodesize(bar)
+ }
+ assertEq(address(this).balance, prevThisBalance + 100);
+ assertEq(vm.getNonce(bar), 0);
+ assertEq(size, 0);
+ assertEq(bar.balance, 0);
+ }
+
+ function test_DeployCodeNoArgs() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar");
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ }
+
+ function test_DeployCodeVal() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether);
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ assertEq(deployed.balance, 1 ether);
+ }
+
+ function test_DeployCodeValNoArgs() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether);
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ assertEq(deployed.balance, 1 ether);
+ }
+
+ // We need this so we can call "this.deployCode" rather than "deployCode" directly
+ function deployCodeHelper(string memory what) external {
+ deployCode(what);
+ }
+
+ function test_RevertIf_DeployCodeFail() public {
+ vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed."));
+ this.deployCodeHelper("StdCheats.t.sol:RevertingContract");
+ }
+
+ function getCode(address who) internal view returns (bytes memory o_code) {
+ assembly ("memory-safe") {
+ // retrieve the size of the code, this needs assembly
+ let size := extcodesize(who)
+ // allocate output byte array - this could also be done without assembly
+ // by using o_code = new bytes(size)
+ o_code := mload(0x40)
+ // new "memory end" including padding
+ mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
+ // store length in memory
+ mstore(o_code, size)
+ // actually retrieve the code, this needs assembly
+ extcodecopy(who, add(o_code, 0x20), 0, size)
+ }
+ }
+
+ function test_DeriveRememberKey() public {
+ string memory mnemonic = "test test test test test test test test test test test junk";
+
+ (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0);
+ assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);
+ assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80);
+ }
+
+ function test_BytesToUint() public pure {
+ assertEq(3, bytesToUint_test(hex"03"));
+ assertEq(2, bytesToUint_test(hex"02"));
+ assertEq(255, bytesToUint_test(hex"ff"));
+ assertEq(29625, bytesToUint_test(hex"73b9"));
+ }
+
+ function test_ParseJsonTxDetail() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ string memory json = vm.readFile(path);
+ bytes memory transactionDetails = json.parseRaw(".transactions[0].tx");
+ RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail));
+ Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail);
+ assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);
+ assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512);
+ assertEq(
+ txDetail.data,
+ hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004"
+ );
+ assertEq(txDetail.nonce, 3);
+ assertEq(txDetail.txType, 2);
+ assertEq(txDetail.gas, 29625);
+ assertEq(txDetail.value, 0);
+ }
+
+ function test_ReadEIP1559Transaction() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ uint256 index = 0;
+ Tx1559 memory transaction = readTx1559(path, index);
+ transaction;
+ }
+
+ function test_ReadEIP1559Transactions() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ Tx1559[] memory transactions = readTx1559s(path);
+ transactions;
+ }
+
+ function test_ReadReceipt() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ uint256 index = 5;
+ Receipt memory receipt = readReceipt(path, index);
+ assertEq(
+ receipt.logsBloom,
+ hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"
+ );
+ }
+
+ function test_ReadReceipts() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ Receipt[] memory receipts = readReceipts(path);
+ receipts;
+ }
+
+ function test_GasMeteringModifier() public {
+ uint256 gas_start_normal = gasleft();
+ addInLoop();
+ uint256 gas_used_normal = gas_start_normal - gasleft();
+
+ uint256 gas_start_single = gasleft();
+ addInLoopNoGas();
+ uint256 gas_used_single = gas_start_single - gasleft();
+
+ uint256 gas_start_double = gasleft();
+ addInLoopNoGasNoGas();
+ uint256 gas_used_double = gas_start_double - gasleft();
+
+ assertTrue(gas_used_double + gas_used_single < gas_used_normal);
+ }
+
+ function addInLoop() internal pure returns (uint256) {
+ uint256 b;
+ for (uint256 i; i < 10000; i++) {
+ b += i;
+ }
+ return b;
+ }
+
+ function addInLoopNoGas() internal noGasMetering returns (uint256) {
+ return addInLoop();
+ }
+
+ function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) {
+ return addInLoopNoGas();
+ }
+
+ function bytesToUint_test(bytes memory b) private pure returns (uint256) {
+ uint256 number;
+ for (uint256 i = 0; i < b.length; i++) {
+ number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1))));
+ }
+ return number;
+ }
+
+ function testFuzz_AssumeAddressIsNot(address addr) external {
+ // skip over Payable and NonPayable enums
+ for (uint8 i = 2; i < uint8(type(AddressType).max); i++) {
+ assumeAddressIsNot(addr, AddressType(i));
+ }
+ assertTrue(addr != address(0));
+ assertTrue(addr < address(1) || addr > address(9));
+ assertTrue(addr != address(vm) || addr != 0x000000000000000000636F6e736F6c652e6c6f67);
+ }
+
+ function test_AssumePayable() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+
+ // all should revert since these addresses are not payable
+
+ // VM address
+ vm.expectRevert();
+ stdCheatsMock.exposedAssumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+
+ // Console address
+ vm.expectRevert();
+ stdCheatsMock.exposedAssumePayable(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ // Create2Deployer
+ vm.expectRevert();
+ stdCheatsMock.exposedAssumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C);
+
+ // all should pass since these addresses are payable
+
+ // vitalik.eth
+ stdCheatsMock.exposedAssumePayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045);
+
+ // mock payable contract
+ MockContractPayable cp = new MockContractPayable();
+ stdCheatsMock.exposedAssumePayable(address(cp));
+ }
+
+ function test_AssumeNotPayable() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+
+ // all should pass since these addresses are not payable
+
+ // VM address
+ stdCheatsMock.exposedAssumeNotPayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+
+ // Console address
+ stdCheatsMock.exposedAssumeNotPayable(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ // Create2Deployer
+ stdCheatsMock.exposedAssumeNotPayable(0x4e59b44847b379578588920cA78FbF26c0B4956C);
+
+ // all should revert since these addresses are payable
+
+ // vitalik.eth
+ vm.expectRevert();
+ stdCheatsMock.exposedAssumeNotPayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045);
+
+ // mock payable contract
+ MockContractPayable cp = new MockContractPayable();
+ vm.expectRevert();
+ stdCheatsMock.exposedAssumeNotPayable(address(cp));
+ }
+
+ function testFuzz_AssumeNotPrecompile(address addr) external {
+ assumeNotPrecompile(addr, getChain("optimism_sepolia").chainId);
+ assertTrue(
+ addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000))
+ || addr > address(0x4200000000000000000000000000000000000800)
+ );
+ }
+
+ function testFuzz_AssumeNotForgeAddress(address addr) external pure {
+ assumeNotForgeAddress(addr);
+ assertTrue(
+ addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67
+ && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C
+ );
+ }
+
+ function test_RevertIf_CannotDeployCodeTo() external {
+ vm.expectRevert("StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.");
+ this._revertDeployCodeTo();
+ }
+
+ function _revertDeployCodeTo() external {
+ deployCodeTo("StdCheats.t.sol:RevertingContract", address(0));
+ }
+
+ function test_DeployCodeTo() external {
+ address arbitraryAddress = makeAddr("arbitraryAddress");
+
+ deployCodeTo(
+ "StdCheats.t.sol:MockContractWithConstructorArgs",
+ abi.encode(uint256(6), true, bytes20(arbitraryAddress)),
+ 1 ether,
+ arbitraryAddress
+ );
+
+ MockContractWithConstructorArgs ct = MockContractWithConstructorArgs(arbitraryAddress);
+
+ assertEq(arbitraryAddress.balance, 1 ether);
+ assertEq(ct.x(), 6);
+ assertTrue(ct.y());
+ assertEq(ct.z(), bytes20(arbitraryAddress));
+ }
+}
+
+contract StdCheatsMock is StdCheats {
+ function exposedAssumePayable(address addr) external {
+ assumePayable(addr);
+ }
+
+ function exposedAssumeNotPayable(address addr) external {
+ assumeNotPayable(addr);
+ }
+
+ // We deploy a mock version so we can properly test expected reverts.
+ function exposedAssumeNotBlacklisted(address token, address addr) external view {
+ return assumeNotBlacklisted(token, addr);
+ }
+}
+
+contract StdCheatsForkTest is Test {
+ address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD;
+ address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A;
+
+ MockUSDT public USDT;
+ MockUSDC public USDC;
+
+ function setUp() public {
+ USDT = new MockUSDT();
+ USDC = new MockUSDC();
+
+ USDC.setBlacklisted(USDC_BLACKLISTED_USER, true);
+ USDT.setBlacklisted(USDT_BLACKLISTED_USER, true);
+ }
+
+ function test_RevertIf_CannotAssumeNoBlacklisted_EOA() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ address eoa = vm.addr({privateKey: 1});
+ vm.expectRevert("StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.");
+ stdCheatsMock.exposedAssumeNotBlacklisted(eoa, address(0));
+ }
+
+ function testFuzz_AssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external view {
+ assumeNotBlacklisted(address(USDC), addr);
+ assumeNotBlacklisted(address(USDT), addr);
+ assertTrue(true);
+ }
+
+ function test_RevertIf_AssumeNoBlacklisted_USDC() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ vm.expectRevert();
+ stdCheatsMock.exposedAssumeNotBlacklisted(address(USDC), USDC_BLACKLISTED_USER);
+ }
+
+ function testFuzz_AssumeNotBlacklisted_USDC(address addr) external view {
+ assumeNotBlacklisted(address(USDC), addr);
+ assertFalse(USDCLike(USDC).isBlacklisted(addr));
+ }
+
+ function test_RevertIf_AssumeNoBlacklisted_USDT() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ vm.expectRevert();
+ stdCheatsMock.exposedAssumeNotBlacklisted(address(USDT), USDT_BLACKLISTED_USER);
+ }
+
+ function testFuzz_AssumeNotBlacklisted_USDT(address addr) external view {
+ assumeNotBlacklisted(address(USDT), addr);
+ assertFalse(USDTLike(USDT).isBlackListed(addr));
+ }
+}
+
+/// @dev https://etherscan.io/token/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#readProxyContract
+interface USDCLike {
+ function isBlacklisted(address) external view returns (bool);
+}
+
+/// @dev https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#readContract
+interface USDTLike {
+ function isBlackListed(address) external view returns (bool);
+}
+
+contract MockUSDT is USDTLike {
+ mapping(address => bool) private blacklist;
+
+ function isBlackListed(address addr) external view returns (bool) {
+ return blacklist[addr];
+ }
+
+ function setBlacklisted(address addr, bool value) external {
+ blacklist[addr] = value;
+ }
+}
+
+contract MockUSDC is USDCLike {
+ mapping(address => bool) private blacklist;
+
+ function isBlacklisted(address addr) external view returns (bool) {
+ return blacklist[addr];
+ }
+
+ function setBlacklisted(address addr, bool value) external {
+ blacklist[addr] = value;
+ }
+}
+
+contract Bar {
+ constructor() payable {
+ /// `DEAL` STDCHEAT
+ totalSupply = 10000e18;
+ balanceOf[address(this)] = totalSupply;
+ }
+
+ /// `HOAX` and `CHANGEPRANK` STDCHEATS
+ function bar(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ }
+
+ function origin(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ require(tx.origin == expectedSender, "!prank");
+ }
+
+ function origin(address expectedSender, address expectedOrigin) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ require(tx.origin == expectedOrigin, "!prank");
+ }
+
+ /// `DEAL` STDCHEAT
+ mapping(address => uint256) public balanceOf;
+ uint256 public totalSupply;
+}
+
+contract BarERC1155 {
+ constructor() payable {
+ /// `DEALERC1155` STDCHEAT
+ _totalSupply[0] = 10000e18;
+ _balances[0][address(this)] = _totalSupply[0];
+ }
+
+ function balanceOf(address account, uint256 id) public view virtual returns (uint256) {
+ return _balances[id][account];
+ }
+
+ function totalSupply(uint256 id) public view virtual returns (uint256) {
+ return _totalSupply[id];
+ }
+
+ /// `DEALERC1155` STDCHEAT
+ mapping(uint256 => mapping(address => uint256)) private _balances;
+ mapping(uint256 => uint256) private _totalSupply;
+}
+
+contract BarERC721 {
+ constructor() payable {
+ /// `DEALERC721` STDCHEAT
+ _owners[1] = address(1);
+ _balances[address(1)] = 1;
+ _owners[2] = address(this);
+ _owners[3] = address(this);
+ _balances[address(this)] = 2;
+ }
+
+ function balanceOf(address owner) public view virtual returns (uint256) {
+ return _balances[owner];
+ }
+
+ function ownerOf(uint256 tokenId) public view virtual returns (address) {
+ address owner = _owners[tokenId];
+ return owner;
+ }
+
+ mapping(uint256 => address) private _owners;
+ mapping(address => uint256) private _balances;
+}
+
+contract RevertingContract {
+ constructor() {
+ revert();
+ }
+}
+
+contract MockContractWithConstructorArgs {
+ uint256 public immutable x;
+ bool public y;
+ bytes20 public z;
+
+ constructor(uint256 _x, bool _y, bytes20 _z) payable {
+ x = _x;
+ y = _y;
+ z = _z;
+ }
+}
+
+contract MockContractPayable {
+ receive() external payable {}
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdConstants.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdConstants.t.sol
new file mode 100644
index 000000000..8ed524ecd
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdConstants.t.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {StdConstants} from "../src/StdConstants.sol";
+import {Test} from "../src/Test.sol";
+
+contract StdConstantsTest is Test {
+ function testVm() public view {
+ assertEq(StdConstants.VM.getBlockNumber(), 1);
+ }
+
+ function testVmDerivation() public pure {
+ assertEq(address(StdConstants.VM), address(uint160(uint256(keccak256("hevm cheat code")))));
+ }
+
+ function testConsoleDerivation() public pure {
+ assertEq(StdConstants.CONSOLE, address(uint160(uint88(bytes11("console.log")))));
+ }
+
+ function testDefaultSender() public view {
+ assertEq(StdConstants.DEFAULT_SENDER, msg.sender);
+ }
+
+ function testDefaultSenderDerivation() public pure {
+ assertEq(StdConstants.DEFAULT_SENDER, address(uint160(uint256(keccak256("foundry default caller")))));
+ }
+
+ function testDefaultTestContract() public {
+ assertEq(StdConstants.DEFAULT_TEST_CONTRACT, address(new Dummy()));
+ }
+
+ function testDefaultTestContractDerivation() public view {
+ assertEq(address(this), StdConstants.VM.computeCreateAddress(StdConstants.DEFAULT_SENDER, 1));
+ assertEq(StdConstants.DEFAULT_TEST_CONTRACT, StdConstants.VM.computeCreateAddress(address(this), 1));
+ }
+}
+
+contract Dummy {}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdError.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdError.t.sol
new file mode 100644
index 000000000..7553ce4ac
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdError.t.sol
@@ -0,0 +1,119 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {stdError} from "../src/StdError.sol";
+import {Test} from "../src/Test.sol";
+
+contract StdErrorsTest is Test {
+ ErrorsTest test;
+
+ function setUp() public {
+ test = new ErrorsTest();
+ }
+
+ function test_RevertIf_AssertionError() public {
+ vm.expectRevert(stdError.assertionError);
+ test.assertionError();
+ }
+
+ function test_RevertIf_ArithmeticError() public {
+ vm.expectRevert(stdError.arithmeticError);
+ test.arithmeticError(10);
+ }
+
+ function test_RevertIf_DivisionError() public {
+ vm.expectRevert(stdError.divisionError);
+ test.divError(0);
+ }
+
+ function test_RevertIf_ModError() public {
+ vm.expectRevert(stdError.divisionError);
+ test.modError(0);
+ }
+
+ function test_RevertIf_EnumConversionError() public {
+ vm.expectRevert(stdError.enumConversionError);
+ test.enumConversion(1);
+ }
+
+ function test_RevertIf_EncodeStgError() public {
+ vm.expectRevert(stdError.encodeStorageError);
+ test.encodeStgError();
+ }
+
+ function test_RevertIf_PopError() public {
+ vm.expectRevert(stdError.popError);
+ test.pop();
+ }
+
+ function test_RevertIf_IndexOOBError() public {
+ vm.expectRevert(stdError.indexOOBError);
+ test.indexOOBError(1);
+ }
+
+ function test_RevertIf_MemOverflowError() public {
+ vm.expectRevert(stdError.memOverflowError);
+ test.mem();
+ }
+
+ function test_RevertIf_InternError() public {
+ vm.expectRevert(stdError.zeroVarError);
+ test.intern();
+ }
+}
+
+contract ErrorsTest {
+ enum T {
+ T1
+ }
+
+ uint256[] public someArr;
+ bytes someBytes;
+
+ function assertionError() public pure {
+ assert(false);
+ }
+
+ function arithmeticError(uint256 a) public pure {
+ a -= 100;
+ }
+
+ function divError(uint256 a) public pure {
+ 100 / a;
+ }
+
+ function modError(uint256 a) public pure {
+ 100 % a;
+ }
+
+ function enumConversion(uint256 a) public pure {
+ T(a);
+ }
+
+ function encodeStgError() public {
+ assembly ("memory-safe") {
+ sstore(someBytes.slot, 1)
+ }
+ keccak256(someBytes);
+ }
+
+ function pop() public {
+ someArr.pop();
+ }
+
+ function indexOOBError(uint256 a) public pure {
+ uint256[] memory t = new uint256[](0);
+ t[a];
+ }
+
+ function mem() public pure {
+ uint256 l = 2 ** 256 / 32;
+ new uint256[](l);
+ }
+
+ function intern() public returns (uint256) {
+ function(uint256) internal returns (uint256) x;
+ x(2);
+ return 7;
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdJson.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdJson.t.sol
new file mode 100644
index 000000000..5594a54a8
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdJson.t.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Test, stdJson} from "../src/Test.sol";
+
+contract StdJsonTest is Test {
+ using stdJson for string;
+
+ string root;
+ string path;
+
+ function setUp() public {
+ root = vm.projectRoot();
+ path = string.concat(root, "/test/fixtures/test.json");
+ }
+
+ struct SimpleJson {
+ uint256 a;
+ string b;
+ }
+
+ struct NestedJson {
+ uint256 a;
+ string b;
+ SimpleJson c;
+ }
+
+ function test_readJson() public view {
+ string memory json = vm.readFile(path);
+ assertEq(json.readUint(".a"), 123);
+ }
+
+ function test_writeJson() public {
+ string memory json = "json";
+ json.serialize("a", uint256(123));
+ string memory semiFinal = json.serialize("b", string("test"));
+ string memory finalJson = json.serialize("c", semiFinal);
+ finalJson.write(path);
+
+ string memory json_ = vm.readFile(path);
+ bytes memory data = json_.parseRaw("$");
+ NestedJson memory decodedData = abi.decode(data, (NestedJson));
+
+ assertEq(decodedData.a, 123);
+ assertEq(decodedData.b, "test");
+ assertEq(decodedData.c.a, 123);
+ assertEq(decodedData.c.b, "test");
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdMath.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdMath.t.sol
new file mode 100644
index 000000000..c7a36ed4d
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdMath.t.sol
@@ -0,0 +1,202 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {stdMath} from "../src/StdMath.sol";
+import {Test, stdError} from "../src/Test.sol";
+
+contract StdMathMock is Test {
+ function exposedPercentDelta(uint256 a, uint256 b) public pure returns (uint256) {
+ return stdMath.percentDelta(a, b);
+ }
+
+ function exposedPercentDelta(int256 a, int256 b) public pure returns (uint256) {
+ return stdMath.percentDelta(a, b);
+ }
+}
+
+contract StdMathTest is Test {
+ function test_GetAbs() external pure {
+ assertEq(stdMath.abs(-50), 50);
+ assertEq(stdMath.abs(50), 50);
+ assertEq(stdMath.abs(-1337), 1337);
+ assertEq(stdMath.abs(0), 0);
+
+ assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1);
+ assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1));
+ }
+
+ function testFuzz_GetAbs(int256 a) external pure {
+ uint256 manualAbs = getAbs(a);
+
+ uint256 abs = stdMath.abs(a);
+
+ assertEq(abs, manualAbs);
+ }
+
+ function test_GetDelta_Uint() external pure {
+ assertEq(stdMath.delta(uint256(0), uint256(0)), 0);
+ assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337);
+ assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max);
+ assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max);
+ assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max);
+
+ assertEq(stdMath.delta(0, uint256(0)), 0);
+ assertEq(stdMath.delta(1337, uint256(0)), 1337);
+ assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max);
+ assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max);
+ assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max);
+
+ assertEq(stdMath.delta(1337, uint256(1337)), 0);
+ assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0);
+ assertEq(stdMath.delta(5000, uint256(1250)), 3750);
+ }
+
+ function testFuzz_GetDelta_Uint(uint256 a, uint256 b) external pure {
+ uint256 manualDelta = a > b ? a - b : b - a;
+
+ uint256 delta = stdMath.delta(a, b);
+
+ assertEq(delta, manualDelta);
+ }
+
+ function test_GetDelta_Int() external pure {
+ assertEq(stdMath.delta(int256(0), int256(0)), 0);
+ assertEq(stdMath.delta(int256(0), int256(1337)), 1337);
+ assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1);
+ assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1);
+ assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1);
+
+ assertEq(stdMath.delta(0, int256(0)), 0);
+ assertEq(stdMath.delta(1337, int256(0)), 1337);
+ assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1);
+ assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1);
+ assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1);
+
+ assertEq(stdMath.delta(-0, int256(0)), 0);
+ assertEq(stdMath.delta(-1337, int256(0)), 1337);
+ assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1);
+ assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1);
+ assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1);
+
+ assertEq(stdMath.delta(int256(0), -0), 0);
+ assertEq(stdMath.delta(int256(0), -1337), 1337);
+ assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1);
+ assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1);
+ assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1);
+
+ assertEq(stdMath.delta(1337, int256(1337)), 0);
+ assertEq(stdMath.delta(type(int256).max, type(int256).max), 0);
+ assertEq(stdMath.delta(type(int256).min, type(int256).min), 0);
+ assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max);
+ assertEq(stdMath.delta(5000, int256(1250)), 3750);
+ }
+
+ function testFuzz_GetDelta_Int(int256 a, int256 b) external pure {
+ uint256 absA = getAbs(a);
+ uint256 absB = getAbs(b);
+ uint256 absDelta = absA > absB ? absA - absB : absB - absA;
+
+ uint256 manualDelta;
+ if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) {
+ manualDelta = absDelta;
+ }
+ // (a < 0 && b >= 0) || (a >= 0 && b < 0)
+ else {
+ manualDelta = absA + absB;
+ }
+
+ uint256 delta = stdMath.delta(a, b);
+
+ assertEq(delta, manualDelta);
+ }
+
+ function test_GetPercentDelta_Uint() external {
+ StdMathMock stdMathMock = new StdMathMock();
+
+ assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18);
+
+ assertEq(stdMath.percentDelta(1337, uint256(1337)), 0);
+ assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0);
+ assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(2500, uint256(2500)), 0);
+ assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18);
+
+ vm.expectRevert("stdMath percentDelta(uint256,uint256): Divisor is zero");
+ stdMathMock.exposedPercentDelta(uint256(1), 0);
+ }
+
+ function testFuzz_GetPercentDelta_Uint(uint192 a, uint192 b) external pure {
+ vm.assume(b != 0);
+ uint256 manualDelta = a > b ? a - b : b - a;
+
+ uint256 manualPercentDelta = manualDelta * 1e18 / b;
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ assertEq(percentDelta, manualPercentDelta);
+ }
+
+ function test_GetPercentDelta_Int() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdMathMock stdMathMock = new StdMathMock();
+
+ assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), -1337), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18);
+
+ assertEq(stdMath.percentDelta(1337, int256(1337)), 0);
+ assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0);
+ assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0);
+
+ assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down
+ assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down
+ assertEq(stdMath.percentDelta(0, int256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(2500, int256(2500)), 0);
+ assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18);
+
+ vm.expectRevert("stdMath percentDelta(int256,int256): Divisor is zero");
+ stdMathMock.exposedPercentDelta(int256(1), 0);
+ }
+
+ function testFuzz_GetPercentDelta_Int(int192 a, int192 b) external pure {
+ vm.assume(b != 0);
+ uint256 absA = getAbs(a);
+ uint256 absB = getAbs(b);
+ uint256 absDelta = absA > absB ? absA - absB : absB - absA;
+
+ uint256 manualDelta;
+ if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) {
+ manualDelta = absDelta;
+ }
+ // (a < 0 && b >= 0) || (a >= 0 && b < 0)
+ else {
+ manualDelta = absA + absB;
+ }
+
+ uint256 manualPercentDelta = manualDelta * 1e18 / absB;
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ assertEq(percentDelta, manualPercentDelta);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ HELPERS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function getAbs(int256 a) private pure returns (uint256) {
+ if (a < 0) {
+ return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a);
+ }
+
+ return uint256(a);
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdStorage.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdStorage.t.sol
new file mode 100644
index 000000000..6a97ae46f
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdStorage.t.sol
@@ -0,0 +1,485 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {stdStorage, StdStorage} from "../src/StdStorage.sol";
+import {Test} from "../src/Test.sol";
+
+contract StdStorageTest is Test {
+ using stdStorage for StdStorage;
+
+ StorageTest internal test;
+
+ function setUp() public {
+ test = new StorageTest();
+ }
+
+ function test_StorageHidden() public {
+ assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find());
+ }
+
+ function test_StorageObvious() public {
+ assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find());
+ }
+
+ function test_StorageExtraSload() public {
+ assertEq(16, stdstore.target(address(test)).sig(test.extra_sload.selector).find());
+ }
+
+ function test_StorageCheckedWriteHidden() public {
+ stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100);
+ assertEq(uint256(test.hidden()), 100);
+ }
+
+ function test_StorageCheckedWriteObvious() public {
+ stdstore.target(address(test)).sig(test.exists.selector).checked_write(100);
+ assertEq(test.exists(), 100);
+ }
+
+ function test_StorageCheckedWriteSignedIntegerHidden() public {
+ stdstore.target(address(test)).sig(test.hidden.selector).checked_write_int(-100);
+ assertEq(int256(uint256(test.hidden())), -100);
+ }
+
+ function test_StorageCheckedWriteSignedIntegerObvious() public {
+ stdstore.target(address(test)).sig(test.tG.selector).checked_write_int(-100);
+ assertEq(test.tG(), -100);
+ }
+
+ function test_StorageMapStructA() public {
+ uint256 slot =
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot);
+ }
+
+ function test_StorageMapStructB() public {
+ uint256 slot =
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot);
+ }
+
+ function test_StorageDeepMap() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this))
+ .with_key(address(this)).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot);
+ }
+
+ function test_StorageCheckedWriteDeepMap() public {
+ stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this))
+ .checked_write(100);
+ assertEq(100, test.deep_map(address(this), address(this)));
+ }
+
+ function test_StorageDeepMapStructA() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(0).find();
+ assertEq(
+ bytes32(
+ uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0
+ ),
+ bytes32(slot)
+ );
+ }
+
+ function test_StorageDeepMapStructB() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(1).find();
+ assertEq(
+ bytes32(
+ uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1
+ ),
+ bytes32(slot)
+ );
+ }
+
+ function test_StorageCheckedWriteDeepMapStructA() public {
+ stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this));
+ assertEq(100, a);
+ assertEq(0, b);
+ }
+
+ function test_StorageCheckedWriteDeepMapStructB() public {
+ stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this));
+ assertEq(0, a);
+ assertEq(100, b);
+ }
+
+ function test_StorageCheckedWriteMapStructA() public {
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.map_struct(address(this));
+ assertEq(a, 100);
+ assertEq(b, 0);
+ }
+
+ function test_StorageCheckedWriteMapStructB() public {
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.map_struct(address(this));
+ assertEq(a, 0);
+ assertEq(b, 100);
+ }
+
+ function test_StorageStructA() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find();
+ assertEq(uint256(7), slot);
+ }
+
+ function test_StorageStructB() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find();
+ assertEq(uint256(7) + 1, slot);
+ }
+
+ function test_StorageCheckedWriteStructA() public {
+ stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.basic();
+ assertEq(a, 100);
+ assertEq(b, 1337);
+ }
+
+ function test_StorageCheckedWriteStructB() public {
+ stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.basic();
+ assertEq(a, 1337);
+ assertEq(b, 100);
+ }
+
+ function test_StorageMapAddrFound() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot);
+ }
+
+ function test_StorageMapAddrRoot() public {
+ (uint256 slot, bytes32 key) =
+ stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).parent();
+ assertEq(address(uint160(uint256(key))), address(this));
+ assertEq(uint256(1), slot);
+ slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).root();
+ assertEq(uint256(1), slot);
+ }
+
+ function test_StorageMapUintFound() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find();
+ assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot);
+ }
+
+ function test_StorageCheckedWriteMapUint() public {
+ stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100);
+ assertEq(100, test.map_uint(100));
+ }
+
+ function test_StorageCheckedWriteMapAddr() public {
+ stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100);
+ assertEq(100, test.map_addr(address(this)));
+ }
+
+ function test_StorageCheckedWriteMapBool() public {
+ stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true);
+ assertTrue(test.map_bool(address(this)));
+ }
+
+ function testFuzz_StorageCheckedWriteMapPacked(address addr, uint128 value) public {
+ stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_lower.selector).with_key(addr)
+ .checked_write(value);
+ assertEq(test.read_struct_lower(addr), value);
+
+ stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_upper.selector).with_key(addr)
+ .checked_write(value);
+ assertEq(test.read_struct_upper(addr), value);
+ }
+
+ function test_StorageCheckedWriteMapPackedFullSuccess() public {
+ uint256 full = test.map_packed(address(1337));
+ // keep upper 128, set lower 128 to 1337
+ full = (full & (uint256((1 << 128) - 1) << 128)) | 1337;
+ stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337)))
+ .checked_write(full);
+ assertEq(1337, test.read_struct_lower(address(1337)));
+ }
+
+ function test_RevertStorageConst() public {
+ StorageTestTarget target = new StorageTestTarget(test);
+
+ vm.expectRevert("stdStorage find(StdStorage): No storage use detected for target.");
+ target.expectRevertStorageConst();
+ }
+
+ function testFuzz_StorageNativePack(uint248 val1, uint248 val2, bool boolVal1, bool boolVal2) public {
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tA.selector).checked_write(val1);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tB.selector).checked_write(boolVal1);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tC.selector).checked_write(boolVal2);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tD.selector).checked_write(val2);
+
+ assertEq(test.tA(), val1);
+ assertEq(test.tB(), boolVal1);
+ assertEq(test.tC(), boolVal2);
+ assertEq(test.tD(), val2);
+ }
+
+ function test_StorageReadBytes32() public {
+ bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32();
+ assertEq(val, hex"1337");
+ }
+
+ function test_StorageReadBool_False() public {
+ bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool();
+ assertEq(val, false);
+ }
+
+ function test_StorageReadBool_True() public {
+ bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool();
+ assertEq(val, true);
+ }
+
+ function test_RevertIf_ReadingNonBoolValue() public {
+ vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.");
+ this.readNonBoolValue();
+ }
+
+ function readNonBoolValue() public {
+ stdstore.target(address(test)).sig(test.tE.selector).read_bool();
+ }
+
+ function test_StorageReadAddress() public {
+ address val = stdstore.target(address(test)).sig(test.tF.selector).read_address();
+ assertEq(val, address(1337));
+ }
+
+ function test_StorageReadUint() public {
+ uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint();
+ assertEq(val, 1);
+ }
+
+ function test_StorageReadInt() public {
+ int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int();
+ assertEq(val, type(int256).min);
+ }
+
+ function testFuzz_Packed(uint256 val, uint8 elemToGet) public {
+ // This function tries an assortment of packed slots, shifts meaning number of elements
+ // that are packed. Shiftsizes are the size of each element, i.e. 8 means a data type that is 8 bits, 16 == 16 bits, etc.
+ // Combined, these determine how a slot is packed. Making it random is too hard to avoid global rejection limit
+ // and make it performant.
+
+ // change the number of shifts
+ for (uint256 i = 1; i < 5; i++) {
+ uint256 shifts = i;
+
+ elemToGet = uint8(bound(elemToGet, 0, shifts - 1));
+
+ uint256[] memory shiftSizes = new uint256[](shifts);
+ for (uint256 j; j < shifts; j++) {
+ shiftSizes[j] = 8 * (j + 1);
+ }
+
+ test.setRandomPacking(val);
+
+ uint256 leftBits;
+ uint256 rightBits;
+ for (uint256 j; j < shiftSizes.length; j++) {
+ if (j < elemToGet) {
+ leftBits += shiftSizes[j];
+ } else if (elemToGet != j) {
+ rightBits += shiftSizes[j];
+ }
+ }
+
+ // we may have some right bits unaccounted for
+ leftBits += 256 - (leftBits + shiftSizes[elemToGet] + rightBits);
+ // clear left bits, then clear right bits and realign
+ uint256 expectedValToRead = (val << leftBits) >> (leftBits + rightBits);
+
+ uint256 readVal = stdstore.target(address(test)).enable_packed_slots()
+ .sig("getRandomPacked(uint8,uint8[],uint8)").with_calldata(abi.encode(shifts, shiftSizes, elemToGet))
+ .read_uint();
+
+ assertEq(readVal, expectedValToRead);
+ }
+ }
+
+ function testFuzz_Packed2(uint256 nvars, uint256 seed) public {
+ // Number of random variables to generate.
+ nvars = bound(nvars, 1, 20);
+
+ // This will decrease as we generate values in the below loop.
+ uint256 bitsRemaining = 256;
+
+ // Generate a random value and size for each variable.
+ uint256[] memory vals = new uint256[](nvars);
+ uint256[] memory sizes = new uint256[](nvars);
+ uint256[] memory offsets = new uint256[](nvars);
+
+ for (uint256 i = 0; i < nvars; i++) {
+ // Generate a random value and size.
+ offsets[i] = i == 0 ? 0 : offsets[i - 1] + sizes[i - 1];
+
+ uint256 nvarsRemaining = nvars - i;
+ uint256 maxVarSize = bitsRemaining - nvarsRemaining + 1;
+ sizes[i] = bound(uint256(keccak256(abi.encodePacked(seed, i + 256))), 1, maxVarSize);
+ bitsRemaining -= sizes[i];
+
+ uint256 maxVal;
+ uint256 varSize = sizes[i];
+ assembly {
+ // mask = (1 << varSize) - 1
+ maxVal := sub(shl(varSize, 1), 1)
+ }
+ vals[i] = bound(uint256(keccak256(abi.encodePacked(seed, i))), 0, maxVal);
+ }
+
+ // Pack all values into the slot.
+ for (uint256 i = 0; i < nvars; i++) {
+ stdstore.enable_packed_slots().target(address(test)).sig("getRandomPacked(uint256,uint256)")
+ .with_key(sizes[i]).with_key(offsets[i]).checked_write(vals[i]);
+ }
+
+ // Verify the read data matches.
+ for (uint256 i = 0; i < nvars; i++) {
+ uint256 readVal = stdstore.enable_packed_slots().target(address(test))
+ .sig("getRandomPacked(uint256,uint256)").with_key(sizes[i]).with_key(offsets[i]).read_uint();
+
+ uint256 retVal = test.getRandomPacked(sizes[i], offsets[i]);
+
+ assertEq(readVal, vals[i]);
+ assertEq(retVal, vals[i]);
+ }
+ }
+
+ function testEdgeCaseArray() public {
+ stdstore.target(address(test)).sig("edgeCaseArray(uint256)").with_key(uint256(0)).checked_write(1);
+ assertEq(test.edgeCaseArray(0), 1);
+ }
+}
+
+contract StorageTestTarget {
+ using stdStorage for StdStorage;
+
+ StdStorage internal stdstore;
+ StorageTest internal test;
+
+ constructor(StorageTest test_) {
+ test = test_;
+ }
+
+ function expectRevertStorageConst() public {
+ stdstore.target(address(test)).sig("const()").find();
+ }
+}
+
+contract StorageTest {
+ uint256 public exists = 1;
+ mapping(address => uint256) public map_addr;
+ mapping(uint256 => uint256) public map_uint;
+ mapping(address => uint256) public map_packed;
+ mapping(address => UnpackedStruct) public map_struct;
+ mapping(address => mapping(address => uint256)) public deep_map;
+ mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct;
+ UnpackedStruct public basic;
+
+ uint248 public tA;
+ bool public tB;
+
+ bool public tC = false;
+ uint248 public tD = 1;
+
+ struct UnpackedStruct {
+ uint256 a;
+ uint256 b;
+ }
+
+ mapping(address => bool) public map_bool;
+
+ bytes32 public tE = hex"1337";
+ address public tF = address(1337);
+ int256 public tG = type(int256).min;
+ bool public tH = true;
+ bytes32 private tI = ~bytes32(hex"1337");
+
+ uint256 randomPacking;
+
+ // Array with length matching values of elements.
+ uint256[] public edgeCaseArray = [3, 3, 3];
+
+ constructor() {
+ basic = UnpackedStruct({a: 1337, b: 1337});
+
+ uint256 two = (1 << 128) | 1;
+ map_packed[msg.sender] = two;
+ map_packed[address(uint160(1337))] = 1 << 128;
+ }
+
+ function read_struct_upper(address who) public view returns (uint256) {
+ return map_packed[who] >> 128;
+ }
+
+ function read_struct_lower(address who) public view returns (uint256) {
+ return map_packed[who] & ((1 << 128) - 1);
+ }
+
+ function hidden() public view returns (bytes32 t) {
+ bytes32 slot = keccak256("my.random.var");
+ assembly ("memory-safe") {
+ t := sload(slot)
+ }
+ }
+
+ function const() public pure returns (bytes32 t) {
+ t = bytes32(hex"1337");
+ }
+
+ function extra_sload() public view returns (bytes32 t) {
+ // trigger read on slot `tE`, and make a staticcall to make sure compiler doesn't optimize this SLOAD away
+ assembly {
+ pop(staticcall(gas(), sload(tE.slot), 0, 0, 0, 0))
+ }
+ t = tI;
+ }
+
+ function setRandomPacking(uint256 val) public {
+ randomPacking = val;
+ }
+
+ function _getMask(uint256 size) internal pure returns (uint256 mask) {
+ assembly {
+ // mask = (1 << size) - 1
+ mask := sub(shl(size, 1), 1)
+ }
+ }
+
+ function setRandomPacking(uint256 val, uint256 size, uint256 offset) public {
+ // Generate mask based on the size of the value
+ uint256 mask = _getMask(size);
+ // Zero out all bits for the word we're about to set
+ uint256 cleanedWord = randomPacking & ~(mask << offset);
+ // Place val in the correct spot of the cleaned word
+ randomPacking = cleanedWord | val << offset;
+ }
+
+ function getRandomPacked(uint256 size, uint256 offset) public view returns (uint256) {
+ // Generate mask based on the size of the value
+ uint256 mask = _getMask(size);
+ // Shift to place the bits in the correct position, and use mask to zero out remaining bits
+ return (randomPacking >> offset) & mask;
+ }
+
+ function getRandomPacked(uint8 shifts, uint8[] memory shiftSizes, uint8 elem) public view returns (uint256) {
+ require(elem < shifts, "!elem");
+ uint256 leftBits;
+ uint256 rightBits;
+
+ for (uint256 i; i < shiftSizes.length; i++) {
+ if (i < elem) {
+ leftBits += shiftSizes[i];
+ } else if (elem != i) {
+ rightBits += shiftSizes[i];
+ }
+ }
+
+ // we may have some right bits unaccounted for
+ leftBits += 256 - (leftBits + shiftSizes[elem] + rightBits);
+
+ // clear left bits, then clear right bits and realign
+ return (randomPacking << leftBits) >> (leftBits + rightBits);
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdStyle.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdStyle.t.sol
new file mode 100644
index 000000000..1146a8df5
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdStyle.t.sol
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Test, console2, StdStyle} from "../src/Test.sol";
+
+contract StdStyleTest is Test {
+ function test_StyleColor() public pure {
+ console2.log(StdStyle.red("StdStyle.red String Test"));
+ console2.log(StdStyle.red(uint256(10e18)));
+ console2.log(StdStyle.red(int256(-10e18)));
+ console2.log(StdStyle.red(true));
+ console2.log(StdStyle.red(address(0)));
+ console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.redBytes32("StdStyle.redBytes32"));
+ console2.log(StdStyle.green("StdStyle.green String Test"));
+ console2.log(StdStyle.green(uint256(10e18)));
+ console2.log(StdStyle.green(int256(-10e18)));
+ console2.log(StdStyle.green(true));
+ console2.log(StdStyle.green(address(0)));
+ console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32"));
+ console2.log(StdStyle.yellow("StdStyle.yellow String Test"));
+ console2.log(StdStyle.yellow(uint256(10e18)));
+ console2.log(StdStyle.yellow(int256(-10e18)));
+ console2.log(StdStyle.yellow(true));
+ console2.log(StdStyle.yellow(address(0)));
+ console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32"));
+ console2.log(StdStyle.blue("StdStyle.blue String Test"));
+ console2.log(StdStyle.blue(uint256(10e18)));
+ console2.log(StdStyle.blue(int256(-10e18)));
+ console2.log(StdStyle.blue(true));
+ console2.log(StdStyle.blue(address(0)));
+ console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32"));
+ console2.log(StdStyle.magenta("StdStyle.magenta String Test"));
+ console2.log(StdStyle.magenta(uint256(10e18)));
+ console2.log(StdStyle.magenta(int256(-10e18)));
+ console2.log(StdStyle.magenta(true));
+ console2.log(StdStyle.magenta(address(0)));
+ console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32"));
+ console2.log(StdStyle.cyan("StdStyle.cyan String Test"));
+ console2.log(StdStyle.cyan(uint256(10e18)));
+ console2.log(StdStyle.cyan(int256(-10e18)));
+ console2.log(StdStyle.cyan(true));
+ console2.log(StdStyle.cyan(address(0)));
+ console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32"));
+ }
+
+ function test_StyleFontWeight() public pure {
+ console2.log(StdStyle.bold("StdStyle.bold String Test"));
+ console2.log(StdStyle.bold(uint256(10e18)));
+ console2.log(StdStyle.bold(int256(-10e18)));
+ console2.log(StdStyle.bold(address(0)));
+ console2.log(StdStyle.bold(true));
+ console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32"));
+ console2.log(StdStyle.dim("StdStyle.dim String Test"));
+ console2.log(StdStyle.dim(uint256(10e18)));
+ console2.log(StdStyle.dim(int256(-10e18)));
+ console2.log(StdStyle.dim(address(0)));
+ console2.log(StdStyle.dim(true));
+ console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32"));
+ console2.log(StdStyle.italic("StdStyle.italic String Test"));
+ console2.log(StdStyle.italic(uint256(10e18)));
+ console2.log(StdStyle.italic(int256(-10e18)));
+ console2.log(StdStyle.italic(address(0)));
+ console2.log(StdStyle.italic(true));
+ console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32"));
+ console2.log(StdStyle.underline("StdStyle.underline String Test"));
+ console2.log(StdStyle.underline(uint256(10e18)));
+ console2.log(StdStyle.underline(int256(-10e18)));
+ console2.log(StdStyle.underline(address(0)));
+ console2.log(StdStyle.underline(true));
+ console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32"));
+ console2.log(StdStyle.inverse("StdStyle.inverse String Test"));
+ console2.log(StdStyle.inverse(uint256(10e18)));
+ console2.log(StdStyle.inverse(int256(-10e18)));
+ console2.log(StdStyle.inverse(address(0)));
+ console2.log(StdStyle.inverse(true));
+ console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32"));
+ }
+
+ function test_StyleCombined() public pure {
+ console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test")));
+ console2.log(StdStyle.green(StdStyle.dim(uint256(10e18))));
+ console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18))));
+ console2.log(StdStyle.blue(StdStyle.underline(address(0))));
+ console2.log(StdStyle.magenta(StdStyle.inverse(true)));
+ }
+
+ function test_StyleCustom() public pure {
+ console2.log(h1("Custom Style 1"));
+ console2.log(h2("Custom Style 2"));
+ }
+
+ function h1(string memory a) private pure returns (string memory) {
+ return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a)));
+ }
+
+ function h2(string memory a) private pure returns (string memory) {
+ return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a)));
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdToml.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdToml.t.sol
new file mode 100644
index 000000000..306dda99f
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdToml.t.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Test, stdToml} from "../src/Test.sol";
+
+contract StdTomlTest is Test {
+ using stdToml for string;
+
+ string root;
+ string path;
+
+ function setUp() public {
+ root = vm.projectRoot();
+ path = string.concat(root, "/test/fixtures/test.toml");
+ }
+
+ struct SimpleToml {
+ uint256 a;
+ string b;
+ }
+
+ struct NestedToml {
+ uint256 a;
+ string b;
+ SimpleToml c;
+ }
+
+ function test_readToml() public view {
+ string memory json = vm.readFile(path);
+ assertEq(json.readUint(".a"), 123);
+ }
+
+ function test_writeToml() public {
+ string memory json = "json";
+ json.serialize("a", uint256(123));
+ string memory semiFinal = json.serialize("b", string("test"));
+ string memory finalJson = json.serialize("c", semiFinal);
+ finalJson.write(path);
+
+ string memory toml = vm.readFile(path);
+ bytes memory data = toml.parseRaw("$");
+ NestedToml memory decodedData = abi.decode(data, (NestedToml));
+
+ assertEq(decodedData.a, 123);
+ assertEq(decodedData.b, "test");
+ assertEq(decodedData.c.a, 123);
+ assertEq(decodedData.c.b, "test");
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdUtils.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdUtils.t.sol
new file mode 100644
index 000000000..c0a3d3acf
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdUtils.t.sol
@@ -0,0 +1,342 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Test, StdUtils} from "../src/Test.sol";
+
+contract StdUtilsMock is StdUtils {
+ // We deploy a mock version so we can properly test expected reverts.
+ function exposedGetTokenBalances(address token, address[] memory addresses)
+ external
+ returns (uint256[] memory balances)
+ {
+ return getTokenBalances(token, addresses);
+ }
+
+ function exposedBound(int256 num, int256 min, int256 max) external pure returns (int256) {
+ return bound(num, min, max);
+ }
+
+ function exposedBound(uint256 num, uint256 min, uint256 max) external pure returns (uint256) {
+ return bound(num, min, max);
+ }
+
+ function exposedBytesToUint(bytes memory b) external pure returns (uint256) {
+ return bytesToUint(b);
+ }
+}
+
+contract StdUtilsTest is Test {
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND UINT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_Bound() public pure {
+ assertEq(bound(uint256(5), 0, 4), 0);
+ assertEq(bound(uint256(0), 69, 69), 69);
+ assertEq(bound(uint256(0), 68, 69), 68);
+ assertEq(bound(uint256(10), 150, 190), 174);
+ assertEq(bound(uint256(300), 2800, 3200), 3107);
+ assertEq(bound(uint256(9999), 1337, 6666), 4669);
+ }
+
+ function test_Bound_WithinRange() public pure {
+ assertEq(bound(uint256(51), 50, 150), 51);
+ assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150));
+ assertEq(bound(uint256(149), 50, 150), 149);
+ assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150));
+ }
+
+ function test_Bound_EdgeCoverage() public pure {
+ assertEq(bound(uint256(0), 50, 150), 50);
+ assertEq(bound(uint256(1), 50, 150), 51);
+ assertEq(bound(uint256(2), 50, 150), 52);
+ assertEq(bound(uint256(3), 50, 150), 53);
+ assertEq(bound(type(uint256).max, 50, 150), 150);
+ assertEq(bound(type(uint256).max - 1, 50, 150), 149);
+ assertEq(bound(type(uint256).max - 2, 50, 150), 148);
+ assertEq(bound(type(uint256).max - 3, 50, 150), 147);
+ }
+
+ function testFuzz_Bound_DistributionIsEven(uint256 min, uint256 size) public pure {
+ size = size % 100 + 1;
+ min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size);
+ uint256 max = min + size - 1;
+ uint256 result;
+
+ for (uint256 i = 1; i <= size * 4; ++i) {
+ // x > max
+ result = bound(max + i, min, max);
+ assertEq(result, min + (i - 1) % size);
+ // x < min
+ result = bound(min - i, min, max);
+ assertEq(result, max - (i - 1) % size);
+ }
+ }
+
+ function testFuzz_Bound(uint256 num, uint256 min, uint256 max) public pure {
+ if (min > max) (min, max) = (max, min);
+
+ uint256 result = bound(num, min, max);
+
+ assertGe(result, min);
+ assertLe(result, max);
+ assertEq(result, bound(result, min, max));
+ if (num >= min && num <= max) assertEq(result, num);
+ }
+
+ function test_BoundUint256Max() public pure {
+ assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1);
+ assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max);
+ }
+
+ function test_RevertIf_BoundMaxLessThanMin() public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min."));
+ stdUtils.exposedBound(uint256(5), 100, 10);
+ }
+
+ function testFuzz_RevertIf_BoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.assume(min > max);
+ vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min."));
+ stdUtils.exposedBound(num, min, max);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND INT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BoundInt() public pure {
+ assertEq(bound(-3, 0, 4), 2);
+ assertEq(bound(0, -69, -69), -69);
+ assertEq(bound(0, -69, -68), -68);
+ assertEq(bound(-10, 150, 190), 154);
+ assertEq(bound(-300, 2800, 3200), 2908);
+ assertEq(bound(9999, -1337, 6666), 1995);
+ }
+
+ function test_BoundInt_WithinRange() public pure {
+ assertEq(bound(51, -50, 150), 51);
+ assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150));
+ assertEq(bound(149, -50, 150), 149);
+ assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150));
+ }
+
+ function test_BoundInt_EdgeCoverage() public pure {
+ assertEq(bound(type(int256).min, -50, 150), -50);
+ assertEq(bound(type(int256).min + 1, -50, 150), -49);
+ assertEq(bound(type(int256).min + 2, -50, 150), -48);
+ assertEq(bound(type(int256).min + 3, -50, 150), -47);
+ assertEq(bound(type(int256).min, 10, 150), 10);
+ assertEq(bound(type(int256).min + 1, 10, 150), 11);
+ assertEq(bound(type(int256).min + 2, 10, 150), 12);
+ assertEq(bound(type(int256).min + 3, 10, 150), 13);
+
+ assertEq(bound(type(int256).max, -50, 150), 150);
+ assertEq(bound(type(int256).max - 1, -50, 150), 149);
+ assertEq(bound(type(int256).max - 2, -50, 150), 148);
+ assertEq(bound(type(int256).max - 3, -50, 150), 147);
+ assertEq(bound(type(int256).max, -50, -10), -10);
+ assertEq(bound(type(int256).max - 1, -50, -10), -11);
+ assertEq(bound(type(int256).max - 2, -50, -10), -12);
+ assertEq(bound(type(int256).max - 3, -50, -10), -13);
+ }
+
+ function testFuzz_BoundInt_DistributionIsEven(int256 min, uint256 size) public pure {
+ size = size % 100 + 1;
+ min = bound(min, -int256(size / 2), int256(size - size / 2));
+ int256 max = min + int256(size) - 1;
+ int256 result;
+
+ for (uint256 i = 1; i <= size * 4; ++i) {
+ // x > max
+ result = bound(max + int256(i), min, max);
+ assertEq(result, min + int256((i - 1) % size));
+ // x < min
+ result = bound(min - int256(i), min, max);
+ assertEq(result, max - int256((i - 1) % size));
+ }
+ }
+
+ function testFuzz_BoundInt(int256 num, int256 min, int256 max) public pure {
+ if (min > max) (min, max) = (max, min);
+
+ int256 result = bound(num, min, max);
+
+ assertGe(result, min);
+ assertLe(result, max);
+ assertEq(result, bound(result, min, max));
+ if (num >= min && num <= max) assertEq(result, num);
+ }
+
+ function test_BoundIntInt256Max() public pure {
+ assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1);
+ assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max);
+ }
+
+ function test_BoundIntInt256Min() public pure {
+ assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min);
+ assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1);
+ }
+
+ function test_RevertIf_BoundIntMaxLessThanMin() public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min."));
+ stdUtils.exposedBound(-5, 100, 10);
+ }
+
+ function testFuzz_RevertIf_BoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.assume(min > max);
+ vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min."));
+ stdUtils.exposedBound(num, min, max);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND PRIVATE KEY
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BoundPrivateKey() public pure {
+ assertEq(boundPrivateKey(0), 1);
+ assertEq(boundPrivateKey(1), 1);
+ assertEq(boundPrivateKey(300), 300);
+ assertEq(boundPrivateKey(9999), 9999);
+ assertEq(boundPrivateKey(SECP256K1_ORDER - 1), SECP256K1_ORDER - 1);
+ assertEq(boundPrivateKey(SECP256K1_ORDER), 1);
+ assertEq(boundPrivateKey(SECP256K1_ORDER + 1), 2);
+ assertEq(boundPrivateKey(UINT256_MAX), UINT256_MAX & SECP256K1_ORDER - 1); // x&y is equivalent to x-x%y
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BYTES TO UINT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BytesToUint() external pure {
+ bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ bytes memory two = hex"02";
+ bytes memory millionEther = hex"d3c21bcecceda1000000";
+
+ assertEq(bytesToUint(maxUint), type(uint256).max);
+ assertEq(bytesToUint(two), 2);
+ assertEq(bytesToUint(millionEther), 1_000_000 ether);
+ }
+
+ function test_RevertIf_BytesLengthExceeds32() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32.");
+ stdUtils.exposedBytesToUint(thirty3Bytes);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ COMPUTE CREATE ADDRESS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_ComputeCreateAddress() external pure {
+ address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9;
+ uint256 nonce = 14;
+ address createAddress = computeCreateAddress(deployer, nonce);
+ assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ COMPUTE CREATE2 ADDRESS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_ComputeCreate2Address() external pure {
+ bytes32 salt = bytes32(uint256(31415));
+ bytes32 initcodeHash = keccak256(abi.encode(0x6080));
+ address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9;
+ address create2Address = computeCreate2Address(salt, initcodeHash, deployer);
+ assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3);
+ }
+
+ function test_ComputeCreate2AddressWithDefaultDeployer() external pure {
+ bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0;
+ bytes32 initcodeHash = hashInitCode(hex"6080", "");
+ assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0);
+ address create2Address = computeCreate2Address(salt, initcodeHash);
+ assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6);
+ }
+}
+
+contract StdUtilsForkTest is Test {
+ /*//////////////////////////////////////////////////////////////////////////
+ GET TOKEN BALANCES
+ //////////////////////////////////////////////////////////////////////////*/
+
+ address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
+ address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170;
+ address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA;
+ address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385;
+
+ address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17;
+ address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52;
+
+ function setUp() public {
+ // All tests of the `getTokenBalances` method are fork tests using live contracts.
+ vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900});
+ }
+
+ function test_RevertIf_CannotGetTokenBalances_NonTokenContract() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function,
+ // so the `balanceOf` call should revert.
+ address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
+ address[] memory addresses = new address[](1);
+ addresses[0] = USDC_HOLDER_0;
+
+ vm.expectRevert("Multicall3: call failed");
+ stdUtils.exposedGetTokenBalances(token, addresses);
+ }
+
+ function test_RevertIf_CannotGetTokenBalances_EOA() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ address eoa = vm.addr({privateKey: 1});
+ address[] memory addresses = new address[](1);
+ addresses[0] = USDC_HOLDER_0;
+ vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract.");
+ stdUtils.exposedGetTokenBalances(eoa, addresses);
+ }
+
+ function test_GetTokenBalances_Empty() external {
+ address[] memory addresses = new address[](0);
+ uint256[] memory balances = getTokenBalances(USDC, addresses);
+ assertEq(balances.length, 0);
+ }
+
+ function test_GetTokenBalances_USDC() external {
+ address[] memory addresses = new address[](2);
+ addresses[0] = USDC_HOLDER_0;
+ addresses[1] = USDC_HOLDER_1;
+ uint256[] memory balances = getTokenBalances(USDC, addresses);
+ assertEq(balances[0], 159_000_000_000_000);
+ assertEq(balances[1], 131_350_000_000_000);
+ }
+
+ function test_GetTokenBalances_SHIB() external {
+ address[] memory addresses = new address[](3);
+ addresses[0] = SHIB_HOLDER_0;
+ addresses[1] = SHIB_HOLDER_1;
+ addresses[2] = SHIB_HOLDER_2;
+ uint256[] memory balances = getTokenBalances(SHIB, addresses);
+ assertEq(balances[0], 3_323_256_285_484.42e18);
+ assertEq(balances[1], 1_271_702_771_149.99999928e18);
+ assertEq(balances[2], 606_357_106_247e18);
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/Vm.t.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/Vm.t.sol
new file mode 100644
index 000000000..8ce466c7e
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/Vm.t.sol
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Test} from "../src/Test.sol";
+import {Vm, VmSafe} from "../src/Vm.sol";
+
+// These tests ensure that functions are never accidentally removed from a Vm interface, or
+// inadvertently moved between Vm and VmSafe. These tests must be updated each time a function is
+// added to or removed from Vm or VmSafe.
+contract VmTest is Test {
+ function test_VmInterfaceId() public pure {
+ assertEq(type(Vm).interfaceId, bytes4(0xe835828d), "Vm");
+ }
+
+ function test_VmSafeInterfaceId() public pure {
+ assertEq(type(VmSafe).interfaceId, bytes4(0x7f58f7be), "VmSafe");
+ }
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationScript.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationScript.sol
new file mode 100644
index 000000000..6efbfa658
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationScript.sol
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Script} from "../../src/Script.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationScript is Script {}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationScriptBase.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationScriptBase.sol
new file mode 100644
index 000000000..75329739d
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationScriptBase.sol
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {ScriptBase} from "../../src/Script.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationScriptBase is ScriptBase {}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationTest.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationTest.sol
new file mode 100644
index 000000000..5ba888e8c
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationTest.sol
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {Test} from "../../src/Test.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationTest is Test {}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationTestBase.sol b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationTestBase.sol
new file mode 100644
index 000000000..9c081f789
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationTestBase.sol
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.8.13 <0.9.0;
+
+import {TestBase} from "../../src/Test.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationTestBase is TestBase {}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/broadcast.log.json b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/broadcast.log.json
new file mode 100644
index 000000000..0a0200bca
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/broadcast.log.json
@@ -0,0 +1,187 @@
+{
+ "transactions": [
+ {
+ "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "function": "multiple_arguments(uint256,address,uint256[]):(uint256)",
+ "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "gas": "0x73b9",
+ "value": "0x0",
+ "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004",
+ "nonce": "0x3",
+ "accessList": []
+ }
+ },
+ {
+ "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "function": "inc():(uint256)",
+ "arguments": [],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "gas": "0xdcb2",
+ "value": "0x0",
+ "data": "0x371303c0",
+ "nonce": "0x4",
+ "accessList": []
+ }
+ },
+ {
+ "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "function": "t(uint256):(uint256)",
+ "arguments": ["1"],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "gas": "0x8599",
+ "value": "0x0",
+ "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001",
+ "nonce": "0x5",
+ "accessList": []
+ }
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181",
+ "transactionIndex": "0x0",
+ "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af",
+ "blockNumber": "0x1",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": null,
+ "cumulativeGasUsed": "0x13f3a",
+ "gasUsed": "0x13f3a",
+ "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782",
+ "transactionIndex": "0x0",
+ "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148",
+ "blockNumber": "0x2",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": null,
+ "cumulativeGasUsed": "0x45d80",
+ "gasUsed": "0x45d80",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d",
+ "transactionIndex": "0x0",
+ "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58",
+ "blockNumber": "0x3",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
+ "cumulativeGasUsed": "0x45feb",
+ "gasUsed": "0x45feb",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f",
+ "transactionIndex": "0x0",
+ "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629",
+ "blockNumber": "0x4",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "cumulativeGasUsed": "0x5905",
+ "gasUsed": "0x5905",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298",
+ "transactionIndex": "0x0",
+ "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11",
+ "blockNumber": "0x5",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "cumulativeGasUsed": "0xa9c4",
+ "gasUsed": "0xa9c4",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "transactionIndex": "0x0",
+ "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb",
+ "blockNumber": "0x6",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "cumulativeGasUsed": "0x66c5",
+ "gasUsed": "0x66c5",
+ "contractAddress": null,
+ "logs": [
+ {
+ "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "topics": [
+ "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b"
+ ],
+ "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000",
+ "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb",
+ "blockNumber": "0x6",
+ "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "transactionIndex": "0x1",
+ "logIndex": "0x0",
+ "transactionLogIndex": "0x0",
+ "removed": false
+ }
+ ],
+ "status": "0x1",
+ "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16",
+ "transactionIndex": "0x0",
+ "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c",
+ "blockNumber": "0x7",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x0000000000000000000000000000000000001337",
+ "cumulativeGasUsed": "0x5208",
+ "gasUsed": "0x5208",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ }
+ ],
+ "libraries": [
+ "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3"
+ ],
+ "pending": [],
+ "path": "broadcast/Broadcast.t.sol/31337/run-latest.json",
+ "returns": {},
+ "timestamp": 1655140035
+}
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/config.toml b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/config.toml
new file mode 100644
index 000000000..e6dcccca5
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/config.toml
@@ -0,0 +1,81 @@
+# ------------------------------------------------
+# EXAMPLE DEPLOYMENT CONFIG
+# ------------------------------------------------
+
+# -- MAINNET -------------------------------------
+
+[mainnet]
+endpoint_url = "${MAINNET_RPC}"
+
+[mainnet.bool]
+is_live = true
+bool_array = [true, false]
+
+[mainnet.address]
+weth = "${WETH_MAINNET}"
+deps = [
+ "0x0000000000000000000000000000000000000000",
+ "0x1111111111111111111111111111111111111111",
+]
+
+[mainnet.uint]
+number = 1234
+number_array = [5678, 9999]
+
+[mainnet.int]
+signed_number = -1234
+signed_number_array = [-5678, 9999]
+
+[mainnet.bytes32]
+word = "0x00000000000000000000000000000000000000000000000000000000000004d2" # 1234
+word_array = [
+ "0x000000000000000000000000000000000000000000000000000000000000162e", # 5678
+ "0x000000000000000000000000000000000000000000000000000000000000270f", # 9999
+]
+
+[mainnet.bytes]
+b = "0xabcd"
+b_array = ["0xdead", "0xbeef"]
+
+[mainnet.string]
+str = "foo"
+str_array = ["bar", "baz"]
+
+# -- OPTIMISM ------------------------------------
+
+[optimism]
+endpoint_url = "${OPTIMISM_RPC}"
+
+[optimism.bool]
+is_live = false
+bool_array = [false, true]
+
+[optimism.address]
+weth = "${WETH_OPTIMISM}"
+deps = [
+ "0x2222222222222222222222222222222222222222",
+ "0x3333333333333333333333333333333333333333",
+]
+
+[optimism.uint]
+number = 9999
+number_array = [1234, 5678]
+
+[optimism.int]
+signed_number = 9999
+signed_number_array = [-1234, -5678]
+
+[optimism.bytes32]
+word = "0x000000000000000000000000000000000000000000000000000000000000270f" # 9999
+word_array = [
+ "0x00000000000000000000000000000000000000000000000000000000000004d2", # 1234
+ "0x000000000000000000000000000000000000000000000000000000000000162e", # 5678
+]
+
+[optimism.bytes]
+b = "0xdcba"
+b_array = ["0xc0ffee", "0xbabe"]
+
+[optimism.string]
+str = "alice"
+str_array = ["bob", "charlie"]
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/test.json b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/test.json
new file mode 100644
index 000000000..caebf6d96
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/test.json
@@ -0,0 +1,8 @@
+{
+ "a": 123,
+ "b": "test",
+ "c": {
+ "a": 123,
+ "b": "test"
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/test.toml b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/test.toml
new file mode 100644
index 000000000..60692bc75
--- /dev/null
+++ b/lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/test.toml
@@ -0,0 +1,6 @@
+a = 123
+b = "test"
+
+[c]
+a = 123
+b = "test"
diff --git a/lib/signals-implicit-mode/foundry.lock b/lib/signals-implicit-mode/foundry.lock
new file mode 100644
index 000000000..9e26dfeeb
--- /dev/null
+++ b/lib/signals-implicit-mode/foundry.lock
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/foundry.toml b/lib/signals-implicit-mode/foundry.toml
new file mode 100644
index 000000000..964d26db3
--- /dev/null
+++ b/lib/signals-implicit-mode/foundry.toml
@@ -0,0 +1,25 @@
+[profile.default]
+src = "src"
+out = "out"
+libs = ["lib", "dependencies"]
+via-ir = false
+solc = "0.8.28"
+evm_version = "paris"
+
+[fmt]
+# Explicitly define all formatting rules
+multiline_func_header = "params_first"
+single_line_statement_blocks = "multi"
+sort_imports = true
+contract_new_lines = true
+override_spacing = false
+line_length = 120
+tab_width = 2
+bracket_spacing = true
+int_types = "long"
+quote_style = "double"
+hex_underscore = "remove"
+wrap_comments = false
+
+[dependencies]
+forge-std = "1.14.0"
diff --git a/lib/signals-implicit-mode/lib/forge-std/.gitattributes b/lib/signals-implicit-mode/lib/forge-std/.gitattributes
new file mode 100644
index 000000000..27042d458
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/.gitattributes
@@ -0,0 +1 @@
+src/Vm.sol linguist-generated
diff --git a/lib/signals-implicit-mode/lib/forge-std/.github/CODEOWNERS b/lib/signals-implicit-mode/lib/forge-std/.github/CODEOWNERS
new file mode 100644
index 000000000..63b25bbbc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/.github/CODEOWNERS
@@ -0,0 +1 @@
+* @danipopes @klkvr @mattsse @grandizzy @yash-atreya @zerosnacks
diff --git a/lib/signals-implicit-mode/lib/forge-std/.github/workflows/ci.yml b/lib/signals-implicit-mode/lib/forge-std/.github/workflows/ci.yml
new file mode 100644
index 000000000..8a4281ed0
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/.github/workflows/ci.yml
@@ -0,0 +1,95 @@
+name: CI
+
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches:
+ - master
+
+jobs:
+ build:
+ name: build +${{ matrix.toolchain }} ${{ matrix.flags }}
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ strategy:
+ fail-fast: false
+ matrix:
+ toolchain: [stable, nightly]
+ flags:
+ - ""
+ - --via-ir
+ - --use solc:0.8.17 --via-ir
+ - --use solc:0.8.17
+ - --use solc:0.8.0
+ - --use solc:0.7.6
+ - --use solc:0.7.0
+ - --use solc:0.6.2
+ - --use solc:0.6.12
+ steps:
+ - uses: actions/checkout@v4
+ - uses: foundry-rs/foundry-toolchain@v1
+ - run: forge --version
+ - run: |
+ case "${{ matrix.flags }}" in
+ *"solc:0.8.0"* | *"solc:0.7"* | *"solc:0.6"*)
+ forge build --skip test --skip Config --skip StdConfig --skip LibVariable --deny-warnings ${{ matrix.flags }}
+ ;;
+ *)
+ forge build --skip test --deny-warnings ${{ matrix.flags }}
+ ;;
+ esac
+ # via-ir compilation time checks.
+ - if: contains(matrix.flags, '--via-ir')
+ run: forge build --skip test --deny-warnings ${{ matrix.flags }} --contracts 'test/compilation/*'
+
+ test:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ strategy:
+ fail-fast: false
+ matrix:
+ toolchain: [stable, nightly]
+ steps:
+ - uses: actions/checkout@v4
+ - uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: ${{ matrix.toolchain }}
+ - run: forge --version
+ - run: |
+ if [ "${{ matrix.toolchain }}" = "stable" ]; then
+ forge test -vvv --no-match-path "test/Config.t.sol"
+ else
+ forge test -vvv
+ fi
+
+ fmt:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - uses: actions/checkout@v4
+ - uses: foundry-rs/foundry-toolchain@v1
+ - run: forge --version
+ - run: forge fmt --check
+
+ typos:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - uses: actions/checkout@v4
+ - uses: crate-ci/typos@v1
+
+ ci-success:
+ runs-on: ubuntu-latest
+ if: always()
+ needs:
+ - build
+ - test
+ - fmt
+ - typos
+ timeout-minutes: 10
+ steps:
+ - name: Decide whether the needed jobs succeeded or failed
+ uses: re-actors/alls-green@release/v1
+ with:
+ jobs: ${{ toJSON(needs) }}
diff --git a/lib/signals-implicit-mode/lib/forge-std/.github/workflows/sync.yml b/lib/signals-implicit-mode/lib/forge-std/.github/workflows/sync.yml
new file mode 100644
index 000000000..9b170f0b7
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/.github/workflows/sync.yml
@@ -0,0 +1,31 @@
+name: Sync Release Branch
+
+on:
+ release:
+ types:
+ - created
+
+jobs:
+ sync-release-branch:
+ runs-on: ubuntu-latest
+ if: startsWith(github.event.release.tag_name, 'v1')
+ steps:
+ - name: Check out the repo
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ ref: v1
+
+ # The email is derived from the bots user id,
+ # found here: https://api.github.com/users/github-actions%5Bbot%5D
+ - name: Configure Git
+ run: |
+ git config user.name github-actions[bot]
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+
+ - name: Sync Release Branch
+ run: |
+ git fetch --tags
+ git checkout v1
+ git reset --hard ${GITHUB_REF}
+ git push --force
diff --git a/lib/signals-implicit-mode/lib/forge-std/CONTRIBUTING.md b/lib/signals-implicit-mode/lib/forge-std/CONTRIBUTING.md
new file mode 100644
index 000000000..541e3d46f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/CONTRIBUTING.md
@@ -0,0 +1,193 @@
+## Contributing to Foundry
+
+Thanks for your interest in improving Foundry!
+
+There are multiple opportunities to contribute at any level. It doesn't matter if you are just getting started with Rust or are the most weathered expert, we can use your help.
+
+This document will help you get started. **Do not let the document intimidate you**.
+It should be considered as a guide to help you navigate the process.
+
+The [dev Telegram][dev-tg] is available for any concerns you may have that are not covered in this guide.
+
+### Code of Conduct
+
+The Foundry project adheres to the [Rust Code of Conduct][rust-coc]. This code of conduct describes the _minimum_ behavior expected from all contributors.
+
+Instances of violations of the Code of Conduct can be reported by contacting the team at [me@gakonst.com](mailto:me@gakonst.com).
+
+### Ways to contribute
+
+There are fundamentally four ways an individual can contribute:
+
+1. **By opening an issue:** For example, if you believe that you have uncovered a bug
+ in Foundry, creating a new issue in the issue tracker is the way to report it.
+2. **By adding context:** Providing additional context to existing issues,
+ such as screenshots and code snippets, which help resolve issues.
+3. **By resolving issues:** Typically this is done in the form of either
+ demonstrating that the issue reported is not a problem after all, or more often,
+ by opening a pull request that fixes the underlying problem, in a concrete and
+ reviewable manner.
+
+**Anybody can participate in any stage of contribution**. We urge you to participate in the discussion
+around bugs and participate in reviewing PRs.
+
+### Contributions Related to Spelling and Grammar
+
+At this time, we will not be accepting contributions that only fix spelling or grammatical errors in documentation, code or
+elsewhere.
+
+### Asking for help
+
+If you have reviewed existing documentation and still have questions, or you are having problems, you can get help in the following ways:
+
+- **Asking in the support Telegram:** The [Foundry Support Telegram][support-tg] is a fast and easy way to ask questions.
+- **Opening a discussion:** This repository comes with a discussions board where you can also ask for help. Click the "Discussions" tab at the top.
+
+As Foundry is still in heavy development, the documentation can be a bit scattered.
+The [Foundry Book][foundry-book] is our current best-effort attempt at keeping up-to-date information.
+
+### Submitting a bug report
+
+When filing a new bug report in the issue tracker, you will be presented with a basic form to fill out.
+
+If you believe that you have uncovered a bug, please fill out the form to the best of your ability. Do not worry if you cannot answer every detail; just fill in what you can. Contributors will ask follow-up questions if something is unclear.
+
+The most important pieces of information we need in a bug report are:
+
+- The Foundry version you are on (and that it is up to date)
+- The platform you are on (Windows, macOS, an M1 Mac or Linux)
+- Code snippets if this is happening in relation to testing or building code
+- Concrete steps to reproduce the bug
+
+In order to rule out the possibility of the bug being in your project, the code snippets should be as minimal
+as possible. It is better if you can reproduce the bug with a small snippet as opposed to an entire project!
+
+See [this guide][mcve] on how to create a minimal, complete, and verifiable example.
+
+### Submitting a feature request
+
+When adding a feature request in the issue tracker, you will be presented with a basic form to fill out.
+
+Please include as detailed of an explanation as possible of the feature you would like, adding additional context if necessary.
+
+If you have examples of other tools that have the feature you are requesting, please include them as well.
+
+### Resolving an issue
+
+Pull requests are the way concrete changes are made to the code, documentation, and dependencies of Foundry.
+
+Even minor pull requests, such as those fixing wording, are greatly appreciated. Before making a large change, it is usually
+a good idea to first open an issue describing the change to solicit feedback and guidance. This will increase
+the likelihood of the PR getting merged.
+
+Please make sure that the following commands pass if you have changed the code:
+
+```sh
+forge fmt --check
+forge test -vvv
+```
+
+To make sure your changes are compatible with all compiler version targets, run the following commands:
+
+```sh
+forge build --skip test --use solc:0.6.2
+forge build --skip test --use solc:0.6.12
+forge build --skip test --use solc:0.7.0
+forge build --skip test --use solc:0.7.6
+forge build --skip test --use solc:0.8.0
+```
+
+The CI will also ensure that the code is formatted correctly and that the tests are passing across all compiler version targets.
+
+#### Adding cheatcodes
+
+Please follow the guide outlined in the [cheatcodes](https://github.com/foundry-rs/foundry/blob/master/docs/dev/cheatcodes.md#adding-a-new-cheatcode) documentation of Foundry.
+
+When making modifications to the native cheatcodes or adding new ones, please make sure to run [`./scripts/vm.py`](./scripts/vm.py) to update the cheatcodes in the [`src/Vm.sol`](./src/Vm.sol) file.
+
+By default the script will automatically generate the cheatcodes from the [`cheatcodes.json`](https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json) file but alternatively you can provide a path to a JSON file containing the Vm interface, as generated by Foundry, with the `--from` flag.
+
+```sh
+./scripts/vm.py --from path/to/cheatcodes.json
+```
+
+It is possible that the resulting [`src/Vm.sol`](./src/Vm.sol) file will have some changes that are not directly related to your changes, this is not a problem.
+
+#### Commits
+
+It is a recommended best practice to keep your changes as logically grouped as possible within individual commits. There is no limit to the number of commits any single pull request may have, and many contributors find it easier to review changes that are split across multiple commits.
+
+That said, if you have a number of commits that are "checkpoints" and don't represent a single logical change, please squash those together.
+
+#### Opening the pull request
+
+From within GitHub, opening a new pull request will present you with a template that should be filled out. Please try your best at filling out the details, but feel free to skip parts if you're not sure what to put.
+
+#### Discuss and update
+
+You will probably get feedback or requests for changes to your pull request.
+This is a big part of the submission process, so don't be discouraged! Some contributors may sign off on the pull request right away, others may have more detailed comments or feedback.
+This is a necessary part of the process in order to evaluate whether the changes are correct and necessary.
+
+**Any community member can review a PR, so you might get conflicting feedback**.
+Keep an eye out for comments from code owners to provide guidance on conflicting feedback.
+
+#### Reviewing pull requests
+
+**Any Foundry community member is welcome to review any pull request**.
+
+All contributors who choose to review and provide feedback on pull requests have a responsibility to both the project and individual making the contribution. Reviews and feedback must be helpful, insightful, and geared towards improving the contribution as opposed to simply blocking it. If there are reasons why you feel the PR should not be merged, explain what those are. Do not expect to be able to block a PR from advancing simply because you say "no" without giving an explanation. Be open to having your mind changed. Be open to working _with_ the contributor to make the pull request better.
+
+Reviews that are dismissive or disrespectful of the contributor or any other reviewers are strictly counter to the Code of Conduct.
+
+When reviewing a pull request, the primary goals are for the codebase to improve and for the person submitting the request to succeed. **Even if a pull request is not merged, the submitter should come away from the experience feeling like their effort was not unappreciated**. Every PR from a new contributor is an opportunity to grow the community.
+
+##### Review a bit at a time
+
+Do not overwhelm new contributors.
+
+It is tempting to micro-optimize and make everything about relative performance, perfect grammar, or exact style matches. Do not succumb to that temptation..
+
+Focus first on the most significant aspects of the change:
+
+1. Does this change make sense for Foundry?
+2. Does this change make Foundry better, even if only incrementally?
+3. Are there clear bugs or larger scale issues that need attending?
+4. Are the commit messages readable and correct? If it contains a breaking change, is it clear enough?
+
+Note that only **incremental** improvement is needed to land a PR. This means that the PR does not need to be perfect, only better than the status quo. Follow-up PRs may be opened to continue iterating.
+
+When changes are necessary, _request_ them, do not _demand_ them, and **do not assume that the submitter already knows how to add a test or run a benchmark**.
+
+Specific performance optimization techniques, coding styles and conventions change over time. The first impression you give to a new contributor never does.
+
+Nits (requests for small changes that are not essential) are fine, but try to avoid stalling the pull request. Most nits can typically be fixed by the Foundry maintainers merging the pull request, but they can also be an opportunity for the contributor to learn a bit more about the project.
+
+It is always good to clearly indicate nits when you comment, e.g.: `Nit: change foo() to bar(). But this is not blocking`.
+
+If your comments were addressed but were not folded after new commits, or if they proved to be mistaken, please, [hide them][hiding-a-comment] with the appropriate reason to keep the conversation flow concise and relevant.
+
+##### Be aware of the person behind the code
+
+Be aware that _how_ you communicate requests and reviews in your feedback can have a significant impact on the success of the pull request. Yes, we may merge a particular change that makes Foundry better, but the individual might just not want to have anything to do with Foundry ever again. The goal is not just having good code.
+
+##### Abandoned or stale pull requests
+
+If a pull request appears to be abandoned or stalled, it is polite to first check with the contributor to see if they intend to continue the work before checking if they would mind if you took it over (especially if it just has nits left). When doing so, it is courteous to give the original contributor credit for the work they started, either by preserving their name and e-mail address in the commit log, or by using the `Author: ` or `Co-authored-by: ` metadata tag in the commits.
+
+_Adapted from the [ethers-rs contributing guide](https://github.com/gakonst/ethers-rs/blob/master/CONTRIBUTING.md)_.
+
+### Releasing
+
+Releases are automatically done by the release workflow when a tag is pushed, however, these steps still need to be taken:
+
+1. Ensure that the versions in the relevant `Cargo.toml` files are up-to-date.
+2. Update documentation links
+3. Perform a final audit for breaking changes.
+
+[rust-coc]: https://github.com/rust-lang/rust/blob/master/CODE_OF_CONDUCT.md
+[dev-tg]: https://t.me/foundry_rs
+[foundry-book]: https://github.com/foundry-rs/foundry-book
+[support-tg]: https://t.me/foundry_support
+[mcve]: https://stackoverflow.com/help/mcve
+[hiding-a-comment]: https://help.github.com/articles/managing-disruptive-comments/#hiding-a-comment
diff --git a/lib/signals-implicit-mode/lib/forge-std/LICENSE-APACHE b/lib/signals-implicit-mode/lib/forge-std/LICENSE-APACHE
new file mode 100644
index 000000000..cf01a499f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/LICENSE-APACHE
@@ -0,0 +1,203 @@
+Copyright Contributors to Forge Standard Library
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/lib/signals-implicit-mode/lib/forge-std/LICENSE-MIT b/lib/signals-implicit-mode/lib/forge-std/LICENSE-MIT
new file mode 100644
index 000000000..28f98304a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright Contributors to Forge Standard Library
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.R
diff --git a/lib/signals-implicit-mode/lib/forge-std/README.md b/lib/signals-implicit-mode/lib/forge-std/README.md
new file mode 100644
index 000000000..91b16f015
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/README.md
@@ -0,0 +1,268 @@
+# Forge Standard Library • [](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml)
+
+Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes.
+
+**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://getfoundry.sh/reference/forge-std/overview/).**
+
+## Install
+
+```bash
+forge install foundry-rs/forge-std
+```
+
+## Contracts
+
+### stdError
+
+This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler built-in errors.
+
+See the contract itself for all error codes.
+
+#### Example usage
+
+```solidity
+
+import "forge-std/Test.sol";
+
+contract TestContract is Test {
+ ErrorsTest test;
+
+ function setUp() public {
+ test = new ErrorsTest();
+ }
+
+ function testExpectArithmetic() public {
+ vm.expectRevert(stdError.arithmeticError);
+ test.arithmeticError(10);
+ }
+}
+
+contract ErrorsTest {
+ function arithmeticError(uint256 a) public {
+ a = a - 100;
+ }
+}
+```
+
+### stdStorage
+
+This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can _always_ find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`).
+
+This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth.
+
+I.e.:
+
+```solidity
+struct T {
+ // depth 0
+ uint256 a;
+ // depth 1
+ uint256 b;
+}
+```
+
+#### Example usage
+
+```solidity
+import "forge-std/Test.sol";
+
+contract TestContract is Test {
+ using stdStorage for StdStorage;
+
+ Storage test;
+
+ function setUp() public {
+ test = new Storage();
+ }
+
+ function testFindExists() public {
+ // Lets say we want to find the slot for the public
+ // variable `exists`. We just pass in the function selector
+ // to the `find` command
+ uint256 slot = stdstore.target(address(test)).sig("exists()").find();
+ assertEq(slot, 0);
+ }
+
+ function testWriteExists() public {
+ // Lets say we want to write to the slot for the public
+ // variable `exists`. We just pass in the function selector
+ // to the `checked_write` command
+ stdstore.target(address(test)).sig("exists()").checked_write(100);
+ assertEq(test.exists(), 100);
+ }
+
+ // It supports arbitrary storage layouts, like assembly based storage locations
+ function testFindHidden() public {
+ // `hidden` is a random hash of a bytes, iteration through slots would
+ // not find it. Our mechanism does
+ // Also, you can use the selector instead of a string
+ uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find();
+ assertEq(slot, uint256(keccak256("my.random.var")));
+ }
+
+ // If targeting a mapping, you have to pass in the keys necessary to perform the find
+ // i.e.:
+ function testFindMapping() public {
+ uint256 slot = stdstore
+ .target(address(test))
+ .sig(test.map_addr.selector)
+ .with_key(address(this))
+ .find();
+ // in the `Storage` constructor, we wrote that this address' value was 1 in the map
+ // so when we load the slot, we expect it to be 1
+ assertEq(uint(vm.load(address(test), bytes32(slot))), 1);
+ }
+
+ // If the target is a struct, you can specify the field depth:
+ function testFindStruct() public {
+ // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc.
+ uint256 slot_for_a_field = stdstore
+ .target(address(test))
+ .sig(test.basicStruct.selector)
+ .depth(0)
+ .find();
+
+ uint256 slot_for_b_field = stdstore
+ .target(address(test))
+ .sig(test.basicStruct.selector)
+ .depth(1)
+ .find();
+
+ assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1);
+ assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2);
+ }
+}
+
+// A complex storage contract
+contract Storage {
+ struct UnpackedStruct {
+ uint256 a;
+ uint256 b;
+ }
+
+ constructor() {
+ map_addr[msg.sender] = 1;
+ }
+
+ uint256 public exists = 1;
+ mapping(address => uint256) public map_addr;
+ // mapping(address => Packed) public map_packed;
+ mapping(address => UnpackedStruct) public map_struct;
+ mapping(address => mapping(address => uint256)) public deep_map;
+ mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct;
+ UnpackedStruct public basicStruct = UnpackedStruct({
+ a: 1,
+ b: 2
+ });
+
+ function hidden() public view returns (bytes32 t) {
+ // an extremely hidden storage slot
+ bytes32 slot = keccak256("my.random.var");
+ assembly {
+ t := sload(slot)
+ }
+ }
+}
+```
+
+### stdCheats
+
+This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for addresses that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you.
+
+#### Example usage:
+
+```solidity
+
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "forge-std/Test.sol";
+
+// Inherit the stdCheats
+contract StdCheatsTest is Test {
+ Bar test;
+ function setUp() public {
+ test = new Bar();
+ }
+
+ function testHoax() public {
+ // we call `hoax`, which gives the target address
+ // eth and then calls `prank`
+ hoax(address(1337));
+ test.bar{value: 100}(address(1337));
+
+ // overloaded to allow you to specify how much eth to
+ // initialize the address with
+ hoax(address(1337), 1);
+ test.bar{value: 1}(address(1337));
+ }
+
+ function testStartHoax() public {
+ // we call `startHoax`, which gives the target address
+ // eth and then calls `startPrank`
+ //
+ // it is also overloaded so that you can specify an eth amount
+ startHoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ test.bar{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+}
+
+contract Bar {
+ function bar(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ }
+}
+```
+
+### Std Assertions
+
+Contains various assertions.
+
+### `console.log`
+
+Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log).
+It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces.
+
+```solidity
+// import it indirectly via Test.sol
+import "forge-std/Test.sol";
+// or directly import it
+import "forge-std/console2.sol";
+...
+console2.log(someValue);
+```
+
+If you need compatibility with Hardhat, you must use the standard `console.sol` instead.
+Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces.
+
+```solidity
+// import it indirectly via Test.sol
+import "forge-std/Test.sol";
+// or directly import it
+import "forge-std/console.sol";
+...
+console.log(someValue);
+```
+
+## Contributing
+
+See our [contributing guidelines](./CONTRIBUTING.md).
+
+## Getting Help
+
+First, see if the answer to your question can be found in [book](https://book.getfoundry.sh).
+
+If the answer is not there:
+
+- Join the [support Telegram](https://t.me/foundry_support) to get help, or
+- Open a [discussion](https://github.com/foundry-rs/foundry/discussions/new/choose) with your question, or
+- Open an issue with [the bug](https://github.com/foundry-rs/foundry/issues/new/choose)
+
+If you want to contribute, or follow along with contributor discussion, you can use our [main telegram](https://t.me/foundry_rs) to chat with us about the development of Foundry!
+
+## License
+
+Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license.
diff --git a/lib/signals-implicit-mode/lib/forge-std/RELEASE_CHECKLIST.md b/lib/signals-implicit-mode/lib/forge-std/RELEASE_CHECKLIST.md
new file mode 100644
index 000000000..4611de4dc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/RELEASE_CHECKLIST.md
@@ -0,0 +1,12 @@
+# Release checklist
+
+This checklist is meant to be used as a guide for the `forge-std` release process.
+
+## Steps
+
+- [ ] Update the version number in `package.json`
+- [ ] Open and merge a PR with the version bump
+- [ ] Tag the merged commit with the version number: `git tag v`
+- [ ] Push the tag to the repository: `git push --tags`
+- [ ] Create a new GitHub release with the automatically generated changelog and with the name set to `v`
+- [ ] Add `## Featured Changes` section to the top of the release notes
diff --git a/lib/signals-implicit-mode/lib/forge-std/foundry.toml b/lib/signals-implicit-mode/lib/forge-std/foundry.toml
new file mode 100644
index 000000000..b68bd546c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/foundry.toml
@@ -0,0 +1,27 @@
+[profile.default]
+fs_permissions = [{ access = "read-write", path = "./" }]
+optimizer = true
+optimizer_runs = 200
+
+# A list of solidity error codes to ignore.
+# 3860 = init-code-size
+ignored_error_codes = [3860]
+
+[rpc_endpoints]
+# The RPC URLs are modified versions of the default for testing initialization.
+mainnet = "https://eth.merkle.io" # Different API key.
+optimism_sepolia = "https://sepolia.optimism.io/" # Adds a trailing slash.
+arbitrum_one_sepolia = "https://sepolia-rollup.arbitrum.io/rpc/" # Adds a trailing slash.
+needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}"
+
+[fmt]
+# These are all the `forge fmt` defaults.
+line_length = 120
+tab_width = 4
+bracket_spacing = false
+int_types = 'long'
+multiline_func_header = 'attributes_first'
+quote_style = 'double'
+number_underscore = 'preserve'
+single_line_statement_blocks = 'preserve'
+ignore = ["src/console.sol", "src/console2.sol"]
diff --git a/lib/signals-implicit-mode/lib/forge-std/package.json b/lib/signals-implicit-mode/lib/forge-std/package.json
new file mode 100644
index 000000000..74e5e6679
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "forge-std",
+ "version": "1.10.0",
+ "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.",
+ "homepage": "https://book.getfoundry.sh/forge/forge-std",
+ "bugs": "https://github.com/foundry-rs/forge-std/issues",
+ "license": "(Apache-2.0 OR MIT)",
+ "author": "Contributors to Forge Standard Library",
+ "files": [
+ "src/**/*"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/foundry-rs/forge-std.git"
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/scripts/vm.py b/lib/signals-implicit-mode/lib/forge-std/scripts/vm.py
new file mode 100644
index 000000000..3cd047d36
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/scripts/vm.py
@@ -0,0 +1,646 @@
+#!/usr/bin/env python3
+
+import argparse
+import copy
+import json
+import re
+import subprocess
+from enum import Enum as PyEnum
+from pathlib import Path
+from typing import Callable
+from urllib import request
+
+VoidFn = Callable[[], None]
+
+CHEATCODES_JSON_URL = "https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json"
+OUT_PATH = "src/Vm.sol"
+
+VM_SAFE_DOC = """\
+/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may
+/// result in Script simulations differing from on-chain execution. It is recommended to only use
+/// these cheats in scripts.
+"""
+
+VM_DOC = """\
+/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used
+/// in tests, but it is not recommended to use these cheats in scripts.
+"""
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Generate Vm.sol based on the cheatcodes json created by Foundry")
+ parser.add_argument(
+ "--from",
+ metavar="PATH",
+ dest="path",
+ required=False,
+ help="path to a json file containing the Vm interface, as generated by Foundry")
+ args = parser.parse_args()
+ json_str = request.urlopen(CHEATCODES_JSON_URL).read().decode("utf-8") if args.path is None else Path(args.path).read_text()
+ contract = Cheatcodes.from_json(json_str)
+
+ ccs = contract.cheatcodes
+ ccs = list(filter(lambda cc: cc.status not in ["experimental", "internal"], ccs))
+ ccs.sort(key=lambda cc: cc.func.id)
+
+ safe = list(filter(lambda cc: cc.safety == "safe", ccs))
+ safe.sort(key=CmpCheatcode)
+ unsafe = list(filter(lambda cc: cc.safety == "unsafe", ccs))
+ unsafe.sort(key=CmpCheatcode)
+ assert len(safe) + len(unsafe) == len(ccs)
+
+ prefix_with_group_headers(safe)
+ prefix_with_group_headers(unsafe)
+
+ out = ""
+
+ out += "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n"
+
+ pp = CheatcodesPrinter(
+ spdx_identifier="MIT OR Apache-2.0",
+ solidity_requirement=">=0.6.2 <0.9.0",
+ abicoder_pragma=True,
+ )
+ pp.p_prelude()
+ pp.prelude = False
+ out += pp.finish()
+
+ out += "\n\n"
+ out += VM_SAFE_DOC
+ vm_safe = Cheatcodes(
+ # TODO: Custom errors were introduced in 0.8.4
+ errors=[], # contract.errors
+ events=contract.events,
+ enums=contract.enums,
+ structs=contract.structs,
+ cheatcodes=safe,
+ )
+ pp.p_contract(vm_safe, "VmSafe")
+ out += pp.finish()
+
+ out += "\n\n"
+ out += VM_DOC
+ vm_unsafe = Cheatcodes(
+ errors=[],
+ events=[],
+ enums=[],
+ structs=[],
+ cheatcodes=unsafe,
+ )
+ pp.p_contract(vm_unsafe, "Vm", "VmSafe")
+ out += pp.finish()
+
+ # Compatibility with <0.8.0
+ def memory_to_calldata(m: re.Match) -> str:
+ return " calldata " + m.group(1)
+
+ out = re.sub(r" memory (.*returns)", memory_to_calldata, out)
+
+ with open(OUT_PATH, "w") as f:
+ f.write(out)
+
+ forge_fmt = ["forge", "fmt", OUT_PATH]
+ res = subprocess.run(forge_fmt)
+ assert res.returncode == 0, f"command failed: {forge_fmt}"
+
+ print(f"Wrote to {OUT_PATH}")
+
+
+class CmpCheatcode:
+ cheatcode: "Cheatcode"
+
+ def __init__(self, cheatcode: "Cheatcode"):
+ self.cheatcode = cheatcode
+
+ def __lt__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) < 0
+
+ def __eq__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) == 0
+
+ def __gt__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) > 0
+
+
+def cmp_cheatcode(a: "Cheatcode", b: "Cheatcode") -> int:
+ if a.group != b.group:
+ return -1 if a.group < b.group else 1
+ if a.status != b.status:
+ return -1 if a.status < b.status else 1
+ if a.safety != b.safety:
+ return -1 if a.safety < b.safety else 1
+ if a.func.id != b.func.id:
+ return -1 if a.func.id < b.func.id else 1
+ return 0
+
+
+# HACK: A way to add group header comments without having to modify printer code
+def prefix_with_group_headers(cheats: list["Cheatcode"]):
+ s = set()
+ for i, cheat in enumerate(cheats):
+ if cheat.group in s:
+ continue
+
+ s.add(cheat.group)
+
+ c = copy.deepcopy(cheat)
+ c.func.description = ""
+ c.func.declaration = f"// ======== {group(c.group)} ========"
+ cheats.insert(i, c)
+ return cheats
+
+
+def group(s: str) -> str:
+ if s == "evm":
+ return "EVM"
+ if s == "json":
+ return "JSON"
+ return s[0].upper() + s[1:]
+
+
+class Visibility(PyEnum):
+ EXTERNAL: str = "external"
+ PUBLIC: str = "public"
+ INTERNAL: str = "internal"
+ PRIVATE: str = "private"
+
+ def __str__(self):
+ return self.value
+
+
+class Mutability(PyEnum):
+ PURE: str = "pure"
+ VIEW: str = "view"
+ NONE: str = ""
+
+ def __str__(self):
+ return self.value
+
+
+class Function:
+ id: str
+ description: str
+ declaration: str
+ visibility: Visibility
+ mutability: Mutability
+ signature: str
+ selector: str
+ selector_bytes: bytes
+
+ def __init__(
+ self,
+ id: str,
+ description: str,
+ declaration: str,
+ visibility: Visibility,
+ mutability: Mutability,
+ signature: str,
+ selector: str,
+ selector_bytes: bytes,
+ ):
+ self.id = id
+ self.description = description
+ self.declaration = declaration
+ self.visibility = visibility
+ self.mutability = mutability
+ self.signature = signature
+ self.selector = selector
+ self.selector_bytes = selector_bytes
+
+ @staticmethod
+ def from_dict(d: dict) -> "Function":
+ return Function(
+ d["id"],
+ d["description"],
+ d["declaration"],
+ Visibility(d["visibility"]),
+ Mutability(d["mutability"]),
+ d["signature"],
+ d["selector"],
+ bytes(d["selectorBytes"]),
+ )
+
+
+class Cheatcode:
+ func: Function
+ group: str
+ status: str
+ safety: str
+
+ def __init__(self, func: Function, group: str, status: str, safety: str):
+ self.func = func
+ self.group = group
+ self.status = status
+ self.safety = safety
+
+ @staticmethod
+ def from_dict(d: dict) -> "Cheatcode":
+ return Cheatcode(
+ Function.from_dict(d["func"]),
+ str(d["group"]),
+ str(d["status"]),
+ str(d["safety"]),
+ )
+
+
+class Error:
+ name: str
+ description: str
+ declaration: str
+
+ def __init__(self, name: str, description: str, declaration: str):
+ self.name = name
+ self.description = description
+ self.declaration = declaration
+
+ @staticmethod
+ def from_dict(d: dict) -> "Error":
+ return Error(**d)
+
+
+class Event:
+ name: str
+ description: str
+ declaration: str
+
+ def __init__(self, name: str, description: str, declaration: str):
+ self.name = name
+ self.description = description
+ self.declaration = declaration
+
+ @staticmethod
+ def from_dict(d: dict) -> "Event":
+ return Event(**d)
+
+
+class EnumVariant:
+ name: str
+ description: str
+
+ def __init__(self, name: str, description: str):
+ self.name = name
+ self.description = description
+
+
+class Enum:
+ name: str
+ description: str
+ variants: list[EnumVariant]
+
+ def __init__(self, name: str, description: str, variants: list[EnumVariant]):
+ self.name = name
+ self.description = description
+ self.variants = variants
+
+ @staticmethod
+ def from_dict(d: dict) -> "Enum":
+ return Enum(
+ d["name"],
+ d["description"],
+ list(map(lambda v: EnumVariant(**v), d["variants"])),
+ )
+
+
+class StructField:
+ name: str
+ ty: str
+ description: str
+
+ def __init__(self, name: str, ty: str, description: str):
+ self.name = name
+ self.ty = ty
+ self.description = description
+
+
+class Struct:
+ name: str
+ description: str
+ fields: list[StructField]
+
+ def __init__(self, name: str, description: str, fields: list[StructField]):
+ self.name = name
+ self.description = description
+ self.fields = fields
+
+ @staticmethod
+ def from_dict(d: dict) -> "Struct":
+ return Struct(
+ d["name"],
+ d["description"],
+ list(map(lambda f: StructField(**f), d["fields"])),
+ )
+
+
+class Cheatcodes:
+ errors: list[Error]
+ events: list[Event]
+ enums: list[Enum]
+ structs: list[Struct]
+ cheatcodes: list[Cheatcode]
+
+ def __init__(
+ self,
+ errors: list[Error],
+ events: list[Event],
+ enums: list[Enum],
+ structs: list[Struct],
+ cheatcodes: list[Cheatcode],
+ ):
+ self.errors = errors
+ self.events = events
+ self.enums = enums
+ self.structs = structs
+ self.cheatcodes = cheatcodes
+
+ @staticmethod
+ def from_dict(d: dict) -> "Cheatcodes":
+ return Cheatcodes(
+ errors=[Error.from_dict(e) for e in d["errors"]],
+ events=[Event.from_dict(e) for e in d["events"]],
+ enums=[Enum.from_dict(e) for e in d["enums"]],
+ structs=[Struct.from_dict(e) for e in d["structs"]],
+ cheatcodes=[Cheatcode.from_dict(e) for e in d["cheatcodes"]],
+ )
+
+ @staticmethod
+ def from_json(s) -> "Cheatcodes":
+ return Cheatcodes.from_dict(json.loads(s))
+
+ @staticmethod
+ def from_json_file(file_path: str) -> "Cheatcodes":
+ with open(file_path, "r") as f:
+ return Cheatcodes.from_dict(json.load(f))
+
+
+class Item(PyEnum):
+ ERROR: str = "error"
+ EVENT: str = "event"
+ ENUM: str = "enum"
+ STRUCT: str = "struct"
+ FUNCTION: str = "function"
+
+
+class ItemOrder:
+ _list: list[Item]
+
+ def __init__(self, list: list[Item]) -> None:
+ assert len(list) <= len(Item), "list must not contain more items than Item"
+ assert len(list) == len(set(list)), "list must not contain duplicates"
+ self._list = list
+ pass
+
+ def get_list(self) -> list[Item]:
+ return self._list
+
+ @staticmethod
+ def default() -> "ItemOrder":
+ return ItemOrder(
+ [
+ Item.ERROR,
+ Item.EVENT,
+ Item.ENUM,
+ Item.STRUCT,
+ Item.FUNCTION,
+ ]
+ )
+
+
+class CheatcodesPrinter:
+ buffer: str
+
+ prelude: bool
+ spdx_identifier: str
+ solidity_requirement: str
+ abicoder_v2: bool
+
+ block_doc_style: bool
+
+ indent_level: int
+ _indent_str: str
+
+ nl_str: str
+
+ items_order: ItemOrder
+
+ def __init__(
+ self,
+ buffer: str = "",
+ prelude: bool = True,
+ spdx_identifier: str = "UNLICENSED",
+ solidity_requirement: str = "",
+ abicoder_pragma: bool = False,
+ block_doc_style: bool = False,
+ indent_level: int = 0,
+ indent_with: int | str = 4,
+ nl_str: str = "\n",
+ items_order: ItemOrder = ItemOrder.default(),
+ ):
+ self.prelude = prelude
+ self.spdx_identifier = spdx_identifier
+ self.solidity_requirement = solidity_requirement
+ self.abicoder_v2 = abicoder_pragma
+ self.block_doc_style = block_doc_style
+ self.buffer = buffer
+ self.indent_level = indent_level
+ self.nl_str = nl_str
+
+ if isinstance(indent_with, int):
+ assert indent_with >= 0
+ self._indent_str = " " * indent_with
+ elif isinstance(indent_with, str):
+ self._indent_str = indent_with
+ else:
+ assert False, "indent_with must be int or str"
+
+ self.items_order = items_order
+
+ def finish(self) -> str:
+ ret = self.buffer.rstrip()
+ self.buffer = ""
+ return ret
+
+ def p_contract(self, contract: Cheatcodes, name: str, inherits: str = ""):
+ if self.prelude:
+ self.p_prelude(contract)
+
+ self._p_str("interface ")
+ name = name.strip()
+ if name != "":
+ self._p_str(name)
+ self._p_str(" ")
+ if inherits != "":
+ self._p_str("is ")
+ self._p_str(inherits)
+ self._p_str(" ")
+ self._p_str("{")
+ self._p_nl()
+ self._with_indent(lambda: self._p_items(contract))
+ self._p_str("}")
+ self._p_nl()
+
+ def _p_items(self, contract: Cheatcodes):
+ for item in self.items_order.get_list():
+ if item == Item.ERROR:
+ self.p_errors(contract.errors)
+ elif item == Item.EVENT:
+ self.p_events(contract.events)
+ elif item == Item.ENUM:
+ self.p_enums(contract.enums)
+ elif item == Item.STRUCT:
+ self.p_structs(contract.structs)
+ elif item == Item.FUNCTION:
+ self.p_functions(contract.cheatcodes)
+ else:
+ assert False, f"unknown item {item}"
+
+ def p_prelude(self, contract: Cheatcodes | None = None):
+ self._p_str(f"// SPDX-License-Identifier: {self.spdx_identifier}")
+ self._p_nl()
+
+ if self.solidity_requirement != "":
+ req = self.solidity_requirement
+ elif contract and len(contract.errors) > 0:
+ req = ">=0.8.4 <0.9.0"
+ else:
+ req = ">=0.6.0 <0.9.0"
+ self._p_str(f"pragma solidity {req};")
+ self._p_nl()
+
+ if self.abicoder_v2:
+ self._p_str("pragma experimental ABIEncoderV2;")
+ self._p_nl()
+
+ self._p_nl()
+
+ def p_errors(self, errors: list[Error]):
+ for error in errors:
+ self._p_line(lambda: self.p_error(error))
+
+ def p_error(self, error: Error):
+ self._p_comment(error.description, doc=True)
+ self._p_line(lambda: self._p_str(error.declaration))
+
+ def p_events(self, events: list[Event]):
+ for event in events:
+ self._p_line(lambda: self.p_event(event))
+
+ def p_event(self, event: Event):
+ self._p_comment(event.description, doc=True)
+ self._p_line(lambda: self._p_str(event.declaration))
+
+ def p_enums(self, enums: list[Enum]):
+ for enum in enums:
+ self._p_line(lambda: self.p_enum(enum))
+
+ def p_enum(self, enum: Enum):
+ self._p_comment(enum.description, doc=True)
+ self._p_line(lambda: self._p_str(f"enum {enum.name} {{"))
+ self._with_indent(lambda: self.p_enum_variants(enum.variants))
+ self._p_line(lambda: self._p_str("}"))
+
+ def p_enum_variants(self, variants: list[EnumVariant]):
+ for i, variant in enumerate(variants):
+ self._p_indent()
+ self._p_comment(variant.description)
+
+ self._p_indent()
+ self._p_str(variant.name)
+ if i < len(variants) - 1:
+ self._p_str(",")
+ self._p_nl()
+
+ def p_structs(self, structs: list[Struct]):
+ for struct in structs:
+ self._p_line(lambda: self.p_struct(struct))
+
+ def p_struct(self, struct: Struct):
+ self._p_comment(struct.description, doc=True)
+ self._p_line(lambda: self._p_str(f"struct {struct.name} {{"))
+ self._with_indent(lambda: self.p_struct_fields(struct.fields))
+ self._p_line(lambda: self._p_str("}"))
+
+ def p_struct_fields(self, fields: list[StructField]):
+ for field in fields:
+ self._p_line(lambda: self.p_struct_field(field))
+
+ def p_struct_field(self, field: StructField):
+ self._p_comment(field.description)
+ self._p_indented(lambda: self._p_str(f"{field.ty} {field.name};"))
+
+ def p_functions(self, cheatcodes: list[Cheatcode]):
+ for cheatcode in cheatcodes:
+ self._p_line(lambda: self.p_function(cheatcode.func))
+
+ def p_function(self, func: Function):
+ self._p_comment(func.description, doc=True)
+ self._p_line(lambda: self._p_str(func.declaration))
+
+ def _p_comment(self, s: str, doc: bool = False):
+ s = s.strip()
+ if s == "":
+ return
+
+ s = map(lambda line: line.lstrip(), s.split("\n"))
+ if self.block_doc_style:
+ self._p_str("/*")
+ if doc:
+ self._p_str("*")
+ self._p_nl()
+ for line in s:
+ self._p_indent()
+ self._p_str(" ")
+ if doc:
+ self._p_str("* ")
+ self._p_str(line)
+ self._p_nl()
+ self._p_indent()
+ self._p_str(" */")
+ self._p_nl()
+ else:
+ first_line = True
+ for line in s:
+ if not first_line:
+ self._p_indent()
+ first_line = False
+
+ if doc:
+ self._p_str("/// ")
+ else:
+ self._p_str("// ")
+ self._p_str(line)
+ self._p_nl()
+
+ def _with_indent(self, f: VoidFn):
+ self._inc_indent()
+ f()
+ self._dec_indent()
+
+ def _p_line(self, f: VoidFn):
+ self._p_indent()
+ f()
+ self._p_nl()
+
+ def _p_indented(self, f: VoidFn):
+ self._p_indent()
+ f()
+
+ def _p_indent(self):
+ for _ in range(self.indent_level):
+ self._p_str(self._indent_str)
+
+ def _p_nl(self):
+ self._p_str(self.nl_str)
+
+ def _p_str(self, txt: str):
+ self.buffer += txt
+
+ def _inc_indent(self):
+ self.indent_level += 1
+
+ def _dec_indent(self):
+ self.indent_level -= 1
+
+
+if __name__ == "__main__":
+ main()
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/Base.sol b/lib/signals-implicit-mode/lib/forge-std/src/Base.sol
new file mode 100644
index 000000000..52a508210
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/Base.sol
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {StdStorage} from "./StdStorage.sol";
+import {Vm, VmSafe} from "./Vm.sol";
+
+abstract contract CommonBase {
+ /// @dev Cheat code address.
+ /// Calculated as `address(uint160(uint256(keccak256("hevm cheat code"))))`.
+ address internal constant VM_ADDRESS = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D;
+
+ /// @dev console.sol and console2.sol work by executing a staticcall to this address.
+ /// Calculated as `address(uint160(uint88(bytes11("console.log"))))`.
+ address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;
+
+ /// @dev Used when deploying with create2.
+ /// Taken from https://github.com/Arachnid/deterministic-deployment-proxy.
+ address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+
+ /// @dev The default address for tx.origin and msg.sender.
+ /// Calculated as `address(uint160(uint256(keccak256("foundry default caller"))))`.
+ address internal constant DEFAULT_SENDER = 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38;
+
+ /// @dev The address of the first contract `CREATE`d by a running test contract.
+ /// When running tests, each test contract is `CREATE`d by `DEFAULT_SENDER` with nonce 1.
+ /// Calculated as `VM.computeCreateAddress(VM.computeCreateAddress(DEFAULT_SENDER, 1), 1)`.
+ address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;
+
+ /// @dev Deterministic deployment address of the Multicall3 contract.
+ /// Taken from https://www.multicall3.com.
+ address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;
+
+ /// @dev The order of the secp256k1 curve.
+ uint256 internal constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+
+ uint256 internal constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ Vm internal constant vm = Vm(VM_ADDRESS);
+ StdStorage internal stdstore;
+}
+
+abstract contract TestBase is CommonBase {}
+
+abstract contract ScriptBase is CommonBase {
+ VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/Config.sol b/lib/signals-implicit-mode/lib/forge-std/src/Config.sol
new file mode 100644
index 000000000..1c63c8721
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/Config.sol
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.13;
+
+import {console} from "./console.sol";
+import {StdConfig} from "./StdConfig.sol";
+import {CommonBase} from "./Base.sol";
+
+/// @notice Boilerplate to streamline the setup of multi-chain environments.
+abstract contract Config is CommonBase {
+ // -- STORAGE (CONFIG + CHAINS + FORKS) ------------------------------------
+
+ /// @dev Contract instance holding the data from the TOML config file.
+ StdConfig internal config;
+
+ /// @dev Array of chain IDs for which forks have been created.
+ uint256[] internal chainIds;
+
+ /// @dev A mapping from a chain ID to its initialized fork ID.
+ mapping(uint256 => uint256) internal forkOf;
+
+ // -- HELPER FUNCTIONS -----------------------------------------------------
+
+ /// @notice Loads configuration from a file.
+ ///
+ /// @dev This function instantiates a `Config` contract, caching all its config variables.
+ ///
+ /// @param filePath: the path to the TOML configuration file.
+ /// @param writeToFile: whether updates are written back to the TOML file.
+ function _loadConfig(string memory filePath, bool writeToFile) internal {
+ console.log("----------");
+ console.log(string.concat("Loading config from '", filePath, "'"));
+ config = new StdConfig(filePath, writeToFile);
+ vm.makePersistent(address(config));
+ console.log("Config successfully loaded");
+ console.log("----------");
+ }
+
+ /// @notice Loads configuration from a file and creates forks for each specified chain.
+ ///
+ /// @dev This function instantiates a `Config` contract, caching all its config variables,
+ /// reads the configured chain ids, and iterates through them to create a fork for each one.
+ /// It also creates a map `forkOf[chainId] -> forkId` to easily switch between forks.
+ ///
+ /// @param filePath: the path to the TOML configuration file.
+ /// @param writeToFile: whether updates are written back to the TOML file.
+ function _loadConfigAndForks(string memory filePath, bool writeToFile) internal {
+ _loadConfig(filePath, writeToFile);
+
+ console.log("Setting up forks for the configured chains...");
+ uint256[] memory chains = config.getChainIds();
+ for (uint256 i = 0; i < chains.length; i++) {
+ uint256 chainId = chains[i];
+ uint256 forkId = vm.createFork(config.getRpcUrl(chainId));
+ forkOf[chainId] = forkId;
+ chainIds.push(chainId);
+ }
+ console.log("Forks successfully created");
+ console.log("----------");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/LibVariable.sol b/lib/signals-implicit-mode/lib/forge-std/src/LibVariable.sol
new file mode 100644
index 000000000..c46b15328
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/LibVariable.sol
@@ -0,0 +1,477 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.13;
+
+// Enable globally.
+using LibVariable for Variable global;
+
+struct Variable {
+ Type ty;
+ bytes data;
+}
+
+struct Type {
+ TypeKind kind;
+ bool isArray;
+}
+
+enum TypeKind {
+ None,
+ Bool,
+ Address,
+ Bytes32,
+ Uint256,
+ Int256,
+ String,
+ Bytes
+}
+
+/// @notice Library for type-safe coercion of the `Variable` struct to concrete types.
+///
+/// @dev Ensures that when a `Variable` is cast to a concrete Solidity type, the operation is safe and the
+/// underlying type matches what is expected.
+/// Provides functions to check types, convert them to strings, and coerce `Variable` instances into
+/// both single values and arrays of various types.
+///
+/// Usage example:
+/// ```solidity
+/// import {LibVariable} from "./LibVariable.sol";
+///
+/// contract MyContract {
+/// using LibVariable for Variable;
+/// StdConfig config; // Assume 'config' is an instance of `StdConfig` and has already been loaded.
+///
+/// function readValues() public {
+/// // Retrieve a 'uint256' value from the config.
+/// uint256 myNumber = config.get("important_number").toUint256();
+///
+/// // Would revert with `TypeMismatch` as 'important_number' isn't a `uint256` in the config file.
+/// // string memory notANumber = config.get("important_number").toString();
+///
+/// // Retrieve a address array from the config.
+/// string[] memory admins = config.get("whitelisted_admins").toAddressArray();
+/// }
+/// }
+/// ```
+library LibVariable {
+ error NotInitialized();
+ error TypeMismatch(string expected, string actual);
+ error UnsafeCast(string message);
+
+ // -- TYPE HELPERS ----------------------------------------------------
+
+ /// @notice Compares two Type instances for equality.
+ function isEqual(Type memory self, Type memory other) internal pure returns (bool) {
+ return self.kind == other.kind && self.isArray == other.isArray;
+ }
+
+ /// @notice Compares two Type instances for equality. Reverts if they are not equal.
+ function assertEq(Type memory self, Type memory other) internal pure {
+ if (!isEqual(self, other)) {
+ revert TypeMismatch(toString(other), toString(self));
+ }
+ }
+
+ /// @notice Converts a Type struct to its full string representation (i.e. "uint256[]").
+ function toString(Type memory self) internal pure returns (string memory) {
+ string memory tyStr = toString(self.kind);
+ if (!self.isArray || self.kind == TypeKind.None) {
+ return tyStr;
+ } else {
+ return string.concat(tyStr, "[]");
+ }
+ }
+
+ /// @dev Converts a `TypeKind` enum to its base string representation.
+ function toString(TypeKind self) internal pure returns (string memory) {
+ if (self == TypeKind.Bool) return "bool";
+ if (self == TypeKind.Address) return "address";
+ if (self == TypeKind.Bytes32) return "bytes32";
+ if (self == TypeKind.Uint256) return "uint256";
+ if (self == TypeKind.Int256) return "int256";
+ if (self == TypeKind.String) return "string";
+ if (self == TypeKind.Bytes) return "bytes";
+ return "none";
+ }
+
+ /// @dev Converts a `TypeKind` enum to its base string representation.
+ function toTomlKey(TypeKind self) internal pure returns (string memory) {
+ if (self == TypeKind.Bool) return "bool";
+ if (self == TypeKind.Address) return "address";
+ if (self == TypeKind.Bytes32) return "bytes32";
+ if (self == TypeKind.Uint256) return "uint";
+ if (self == TypeKind.Int256) return "int";
+ if (self == TypeKind.String) return "string";
+ if (self == TypeKind.Bytes) return "bytes";
+ return "none";
+ }
+
+ // -- VARIABLE HELPERS ----------------------------------------------------
+
+ /// @dev Checks if a `Variable` has been initialized and matches the expected type reverting if not.
+ modifier check(Variable memory self, Type memory expected) {
+ assertExists(self);
+ assertEq(self.ty, expected);
+ _;
+ }
+
+ /// @dev Checks if a `Variable` has been initialized, reverting if not.
+ function assertExists(Variable memory self) public pure {
+ if (self.ty.kind == TypeKind.None) {
+ revert NotInitialized();
+ }
+ }
+
+ // -- VARIABLE COERCION FUNCTIONS (SINGLE VALUES) --------------------------
+
+ /// @notice Coerces a `Variable` to a `bool` value.
+ function toBool(Variable memory self) internal pure check(self, Type(TypeKind.Bool, false)) returns (bool) {
+ return abi.decode(self.data, (bool));
+ }
+
+ /// @notice Coerces a `Variable` to an `address` value.
+ function toAddress(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Address, false))
+ returns (address)
+ {
+ return abi.decode(self.data, (address));
+ }
+
+ /// @notice Coerces a `Variable` to a `bytes32` value.
+ function toBytes32(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bytes32, false))
+ returns (bytes32)
+ {
+ return abi.decode(self.data, (bytes32));
+ }
+
+ /// @notice Coerces a `Variable` to a `uint256` value.
+ function toUint256(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Uint256, false))
+ returns (uint256)
+ {
+ return abi.decode(self.data, (uint256));
+ }
+
+ /// @notice Coerces a `Variable` to a `uint128` value, checking for overflow.
+ function toUint128(Variable memory self) internal pure returns (uint128) {
+ uint256 value = self.toUint256();
+ if (value > type(uint128).max) {
+ revert UnsafeCast("value does not fit in 'uint128'");
+ }
+ return uint128(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `uint64` value, checking for overflow.
+ function toUint64(Variable memory self) internal pure returns (uint64) {
+ uint256 value = self.toUint256();
+ if (value > type(uint64).max) {
+ revert UnsafeCast("value does not fit in 'uint64'");
+ }
+ return uint64(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `uint32` value, checking for overflow.
+ function toUint32(Variable memory self) internal pure returns (uint32) {
+ uint256 value = self.toUint256();
+ if (value > type(uint32).max) {
+ revert UnsafeCast("value does not fit in 'uint32'");
+ }
+ return uint32(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `uint16` value, checking for overflow.
+ function toUint16(Variable memory self) internal pure returns (uint16) {
+ uint256 value = self.toUint256();
+ if (value > type(uint16).max) {
+ revert UnsafeCast("value does not fit in 'uint16'");
+ }
+ return uint16(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `uint8` value, checking for overflow.
+ function toUint8(Variable memory self) internal pure returns (uint8) {
+ uint256 value = self.toUint256();
+ if (value > type(uint8).max) {
+ revert UnsafeCast("value does not fit in 'uint8'");
+ }
+ return uint8(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int256` value.
+ function toInt256(Variable memory self) internal pure check(self, Type(TypeKind.Int256, false)) returns (int256) {
+ return abi.decode(self.data, (int256));
+ }
+
+ /// @notice Coerces a `Variable` to an `int128` value, checking for overflow/underflow.
+ function toInt128(Variable memory self) internal pure returns (int128) {
+ int256 value = self.toInt256();
+ if (value > type(int128).max || value < type(int128).min) {
+ revert UnsafeCast("value does not fit in 'int128'");
+ }
+ return int128(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int64` value, checking for overflow/underflow.
+ function toInt64(Variable memory self) internal pure returns (int64) {
+ int256 value = self.toInt256();
+ if (value > type(int64).max || value < type(int64).min) {
+ revert UnsafeCast("value does not fit in 'int64'");
+ }
+ return int64(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int32` value, checking for overflow/underflow.
+ function toInt32(Variable memory self) internal pure returns (int32) {
+ int256 value = self.toInt256();
+ if (value > type(int32).max || value < type(int32).min) {
+ revert UnsafeCast("value does not fit in 'int32'");
+ }
+ return int32(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int16` value, checking for overflow/underflow.
+ function toInt16(Variable memory self) internal pure returns (int16) {
+ int256 value = self.toInt256();
+ if (value > type(int16).max || value < type(int16).min) {
+ revert UnsafeCast("value does not fit in 'int16'");
+ }
+ return int16(value);
+ }
+
+ /// @notice Coerces a `Variable` to an `int8` value, checking for overflow/underflow.
+ function toInt8(Variable memory self) internal pure returns (int8) {
+ int256 value = self.toInt256();
+ if (value > type(int8).max || value < type(int8).min) {
+ revert UnsafeCast("value does not fit in 'int8'");
+ }
+ return int8(value);
+ }
+
+ /// @notice Coerces a `Variable` to a `string` value.
+ function toString(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.String, false))
+ returns (string memory)
+ {
+ return abi.decode(self.data, (string));
+ }
+
+ /// @notice Coerces a `Variable` to a `bytes` value.
+ function toBytes(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bytes, false))
+ returns (bytes memory)
+ {
+ return abi.decode(self.data, (bytes));
+ }
+
+ // -- VARIABLE COERCION FUNCTIONS (ARRAYS) ---------------------------------
+
+ /// @notice Coerces a `Variable` to a `bool` array.
+ function toBoolArray(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bool, true))
+ returns (bool[] memory)
+ {
+ return abi.decode(self.data, (bool[]));
+ }
+
+ /// @notice Coerces a `Variable` to an `address` array.
+ function toAddressArray(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Address, true))
+ returns (address[] memory)
+ {
+ return abi.decode(self.data, (address[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `bytes32` array.
+ function toBytes32Array(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bytes32, true))
+ returns (bytes32[] memory)
+ {
+ return abi.decode(self.data, (bytes32[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `uint256` array.
+ function toUint256Array(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Uint256, true))
+ returns (uint256[] memory)
+ {
+ return abi.decode(self.data, (uint256[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `uint128` array, checking for overflow.
+ function toUint128Array(Variable memory self) internal pure returns (uint128[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint128[] memory result = new uint128[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint128).max) {
+ revert UnsafeCast("value in array does not fit in 'uint128'");
+ }
+ result[i] = uint128(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `uint64` array, checking for overflow.
+ function toUint64Array(Variable memory self) internal pure returns (uint64[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint64[] memory result = new uint64[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint64).max) {
+ revert UnsafeCast("value in array does not fit in 'uint64'");
+ }
+ result[i] = uint64(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `uint32` array, checking for overflow.
+ function toUint32Array(Variable memory self) internal pure returns (uint32[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint32[] memory result = new uint32[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint32).max) {
+ revert UnsafeCast("value in array does not fit in 'uint32'");
+ }
+ result[i] = uint32(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `uint16` array, checking for overflow.
+ function toUint16Array(Variable memory self) internal pure returns (uint16[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint16[] memory result = new uint16[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint16).max) {
+ revert UnsafeCast("value in array does not fit in 'uint16'");
+ }
+ result[i] = uint16(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `uint8` array, checking for overflow.
+ function toUint8Array(Variable memory self) internal pure returns (uint8[] memory) {
+ uint256[] memory values = self.toUint256Array();
+ uint8[] memory result = new uint8[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(uint8).max) {
+ revert UnsafeCast("value in array does not fit in 'uint8'");
+ }
+ result[i] = uint8(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to an `int256` array.
+ function toInt256Array(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Int256, true))
+ returns (int256[] memory)
+ {
+ return abi.decode(self.data, (int256[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `int128` array, checking for overflow/underflow.
+ function toInt128Array(Variable memory self) internal pure returns (int128[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int128[] memory result = new int128[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int128).max || values[i] < type(int128).min) {
+ revert UnsafeCast("value in array does not fit in 'int128'");
+ }
+ result[i] = int128(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `int64` array, checking for overflow/underflow.
+ function toInt64Array(Variable memory self) internal pure returns (int64[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int64[] memory result = new int64[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int64).max || values[i] < type(int64).min) {
+ revert UnsafeCast("value in array does not fit in 'int64'");
+ }
+ result[i] = int64(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `int32` array, checking for overflow/underflow.
+ function toInt32Array(Variable memory self) internal pure returns (int32[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int32[] memory result = new int32[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int32).max || values[i] < type(int32).min) {
+ revert UnsafeCast("value in array does not fit in 'int32'");
+ }
+ result[i] = int32(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `int16` array, checking for overflow/underflow.
+ function toInt16Array(Variable memory self) internal pure returns (int16[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int16[] memory result = new int16[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int16).max || values[i] < type(int16).min) {
+ revert UnsafeCast("value in array does not fit in 'int16'");
+ }
+ result[i] = int16(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `int8` array, checking for overflow/underflow.
+ function toInt8Array(Variable memory self) internal pure returns (int8[] memory) {
+ int256[] memory values = self.toInt256Array();
+ int8[] memory result = new int8[](values.length);
+ for (uint256 i = 0; i < values.length; i++) {
+ if (values[i] > type(int8).max || values[i] < type(int8).min) {
+ revert UnsafeCast("value in array does not fit in 'int8'");
+ }
+ result[i] = int8(values[i]);
+ }
+ return result;
+ }
+
+ /// @notice Coerces a `Variable` to a `string` array.
+ function toStringArray(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.String, true))
+ returns (string[] memory)
+ {
+ return abi.decode(self.data, (string[]));
+ }
+
+ /// @notice Coerces a `Variable` to a `bytes` array.
+ function toBytesArray(Variable memory self)
+ internal
+ pure
+ check(self, Type(TypeKind.Bytes, true))
+ returns (bytes[] memory)
+ {
+ return abi.decode(self.data, (bytes[]));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/Script.sol b/lib/signals-implicit-mode/lib/forge-std/src/Script.sol
new file mode 100644
index 000000000..a2e2aa1cd
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/Script.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+// 💬 ABOUT
+// Forge Std's default Script.
+
+// 🧩 MODULES
+import {console} from "./console.sol";
+import {console2} from "./console2.sol";
+import {safeconsole} from "./safeconsole.sol";
+import {StdChains} from "./StdChains.sol";
+import {StdCheatsSafe} from "./StdCheats.sol";
+import {StdConstants} from "./StdConstants.sol";
+import {stdJson} from "./StdJson.sol";
+import {stdMath} from "./StdMath.sol";
+import {StdStorage, stdStorageSafe} from "./StdStorage.sol";
+import {StdStyle} from "./StdStyle.sol";
+import {StdUtils} from "./StdUtils.sol";
+import {VmSafe} from "./Vm.sol";
+
+// 📦 BOILERPLATE
+import {ScriptBase} from "./Base.sol";
+
+// ⭐️ SCRIPT
+abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils {
+ // Note: IS_SCRIPT() must return true.
+ bool public IS_SCRIPT = true;
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdAssertions.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdAssertions.sol
new file mode 100644
index 000000000..4248170da
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdAssertions.sol
@@ -0,0 +1,764 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+pragma experimental ABIEncoderV2;
+
+import {Vm} from "./Vm.sol";
+
+abstract contract StdAssertions {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ event log(string);
+ event logs(bytes);
+
+ event log_address(address);
+ event log_bytes32(bytes32);
+ event log_int(int256);
+ event log_uint(uint256);
+ event log_bytes(bytes);
+ event log_string(string);
+
+ event log_named_address(string key, address val);
+ event log_named_bytes32(string key, bytes32 val);
+ event log_named_decimal_int(string key, int256 val, uint256 decimals);
+ event log_named_decimal_uint(string key, uint256 val, uint256 decimals);
+ event log_named_int(string key, int256 val);
+ event log_named_uint(string key, uint256 val);
+ event log_named_bytes(string key, bytes val);
+ event log_named_string(string key, string val);
+
+ event log_array(uint256[] val);
+ event log_array(int256[] val);
+ event log_array(address[] val);
+ event log_named_array(string key, uint256[] val);
+ event log_named_array(string key, int256[] val);
+ event log_named_array(string key, address[] val);
+
+ bytes32 private constant FAILED_SLOT = bytes32("failed");
+
+ bool private _failed;
+
+ function failed() public view returns (bool) {
+ if (_failed) {
+ return true;
+ } else {
+ return vm.load(address(vm), FAILED_SLOT) != bytes32(0);
+ }
+ }
+
+ function fail() internal virtual {
+ vm.store(address(vm), FAILED_SLOT, bytes32(uint256(1)));
+ _failed = true;
+ }
+
+ function fail(string memory message) internal virtual {
+ fail();
+ vm.assertTrue(false, message);
+ }
+
+ function assertTrue(bool data) internal pure virtual {
+ if (!data) {
+ vm.assertTrue(data);
+ }
+ }
+
+ function assertTrue(bool data, string memory err) internal pure virtual {
+ if (!data) {
+ vm.assertTrue(data, err);
+ }
+ }
+
+ function assertFalse(bool data) internal pure virtual {
+ if (data) {
+ vm.assertFalse(data);
+ }
+ }
+
+ function assertFalse(bool data, string memory err) internal pure virtual {
+ if (data) {
+ vm.assertFalse(data, err);
+ }
+ }
+
+ function assertEq(bool left, bool right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(bool left, bool right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEq(uint256 left, uint256 right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals);
+ }
+
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals, err);
+ }
+
+ function assertEq(int256 left, int256 right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals);
+ }
+
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals, err);
+ }
+
+ function assertEq(address left, address right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(address left, address right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEq(bytes32 left, bytes32 right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEq32(bytes32 left, bytes32 right) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right);
+ }
+ }
+
+ function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ if (left != right) {
+ vm.assertEq(left, right, err);
+ }
+ }
+
+ function assertEq(string memory left, string memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(string memory left, string memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes memory left, bytes memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bool[] memory left, bool[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(int256[] memory left, int256[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(address[] memory left, address[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(string[] memory left, string[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ // Legacy helper
+ function assertEqUint(uint256 left, uint256 right) internal pure virtual {
+ assertEq(left, right);
+ }
+
+ function assertNotEq(bool left, bool right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(bool left, bool right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEq(uint256 left, uint256 right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals);
+ }
+
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err)
+ internal
+ pure
+ virtual
+ {
+ vm.assertNotEqDecimal(left, right, decimals, err);
+ }
+
+ function assertNotEq(int256 left, int256 right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals);
+ }
+
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals, err);
+ }
+
+ function assertNotEq(address left, address right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(address left, address right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEq(bytes32 left, bytes32 right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right);
+ }
+ }
+
+ function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ if (left == right) {
+ vm.assertNotEq(left, right, err);
+ }
+ }
+
+ function assertNotEq(string memory left, string memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes memory left, bytes memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(address[] memory left, address[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(string[] memory left, string[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertLt(uint256 left, uint256 right) internal pure virtual {
+ if (left >= right) {
+ vm.assertLt(left, right);
+ }
+ }
+
+ function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left >= right) {
+ vm.assertLt(left, right, err);
+ }
+ }
+
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals);
+ }
+
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals, err);
+ }
+
+ function assertLt(int256 left, int256 right) internal pure virtual {
+ if (left >= right) {
+ vm.assertLt(left, right);
+ }
+ }
+
+ function assertLt(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left >= right) {
+ vm.assertLt(left, right, err);
+ }
+ }
+
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals);
+ }
+
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals, err);
+ }
+
+ function assertGt(uint256 left, uint256 right) internal pure virtual {
+ if (left <= right) {
+ vm.assertGt(left, right);
+ }
+ }
+
+ function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left <= right) {
+ vm.assertGt(left, right, err);
+ }
+ }
+
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals);
+ }
+
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals, err);
+ }
+
+ function assertGt(int256 left, int256 right) internal pure virtual {
+ if (left <= right) {
+ vm.assertGt(left, right);
+ }
+ }
+
+ function assertGt(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left <= right) {
+ vm.assertGt(left, right, err);
+ }
+ }
+
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals);
+ }
+
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals, err);
+ }
+
+ function assertLe(uint256 left, uint256 right) internal pure virtual {
+ if (left > right) {
+ vm.assertLe(left, right);
+ }
+ }
+
+ function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left > right) {
+ vm.assertLe(left, right, err);
+ }
+ }
+
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals);
+ }
+
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals, err);
+ }
+
+ function assertLe(int256 left, int256 right) internal pure virtual {
+ if (left > right) {
+ vm.assertLe(left, right);
+ }
+ }
+
+ function assertLe(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left > right) {
+ vm.assertLe(left, right, err);
+ }
+ }
+
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals);
+ }
+
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals, err);
+ }
+
+ function assertGe(uint256 left, uint256 right) internal pure virtual {
+ if (left < right) {
+ vm.assertGe(left, right);
+ }
+ }
+
+ function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual {
+ if (left < right) {
+ vm.assertGe(left, right, err);
+ }
+ }
+
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals);
+ }
+
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals, err);
+ }
+
+ function assertGe(int256 left, int256 right) internal pure virtual {
+ if (left < right) {
+ vm.assertGe(left, right);
+ }
+ }
+
+ function assertGe(int256 left, int256 right, string memory err) internal pure virtual {
+ if (left < right) {
+ vm.assertGe(left, right, err);
+ }
+ }
+
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals);
+ }
+
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals, err);
+ }
+
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta);
+ }
+
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbs(left, right, maxDelta, err);
+ }
+
+ function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);
+ }
+
+ function assertApproxEqAbsDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);
+ }
+
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta);
+ }
+
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta, err);
+ }
+
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);
+ }
+
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);
+ }
+
+ function assertApproxEqRel(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%
+ ) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta);
+ }
+
+ function assertApproxEqRel(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta, err);
+ }
+
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);
+ }
+
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);
+ }
+
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta);
+ }
+
+ function assertApproxEqRel(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta, err);
+ }
+
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);
+ }
+
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);
+ }
+
+ // Inherited from DSTest, not used but kept for backwards-compatibility
+ function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) {
+ return keccak256(left) == keccak256(right);
+ }
+
+ function assertEq0(bytes memory left, bytes memory right) internal pure virtual {
+ assertEq(left, right);
+ }
+
+ function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ assertEq(left, right, err);
+ }
+
+ function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual {
+ assertNotEq(left, right);
+ }
+
+ function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ assertNotEq(left, right, err);
+ }
+
+ function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {
+ assertEqCall(target, callDataA, target, callDataB, true);
+ }
+
+ function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)
+ internal
+ virtual
+ {
+ assertEqCall(targetA, callDataA, targetB, callDataB, true);
+ }
+
+ function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)
+ internal
+ virtual
+ {
+ assertEqCall(target, callDataA, target, callDataB, strictRevertData);
+ }
+
+ function assertEqCall(
+ address targetA,
+ bytes memory callDataA,
+ address targetB,
+ bytes memory callDataB,
+ bool strictRevertData
+ ) internal virtual {
+ (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);
+ (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);
+
+ if (successA && successB) {
+ assertEq(returnDataA, returnDataB, "Call return data does not match");
+ }
+
+ if (!successA && !successB && strictRevertData) {
+ assertEq(returnDataA, returnDataB, "Call revert data does not match");
+ }
+
+ if (!successA && successB) {
+ emit log("Error: Calls were not equal");
+ emit log_named_bytes(" Left call revert data", returnDataA);
+ emit log_named_bytes(" Right call return data", returnDataB);
+ revert("assertion failed");
+ }
+
+ if (successA && !successB) {
+ emit log("Error: Calls were not equal");
+ emit log_named_bytes(" Left call return data", returnDataA);
+ emit log_named_bytes(" Right call revert data", returnDataB);
+ revert("assertion failed");
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdChains.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdChains.sol
new file mode 100644
index 000000000..3bc5f43af
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdChains.sol
@@ -0,0 +1,287 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+pragma experimental ABIEncoderV2;
+
+import {VmSafe} from "./Vm.sol";
+
+/**
+ * StdChains provides information about EVM compatible chains that can be used in scripts/tests.
+ * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are
+ * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of
+ * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the
+ * alias used in this contract, which can be found as the first argument to the
+ * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.
+ *
+ * There are two main ways to use this contract:
+ * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or
+ * `setChain(string memory chainAlias, Chain memory chain)`
+ * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.
+ *
+ * The first time either of those are used, chains are initialized with the default set of RPC URLs.
+ * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in
+ * `defaultRpcUrls`.
+ *
+ * The `setChain` function is straightforward, and it simply saves off the given chain data.
+ *
+ * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say
+ * we want to retrieve the RPC URL for `mainnet`:
+ * - If you have specified data with `setChain`, it will return that.
+ * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it
+ * is valid (e.g. a URL is specified, or an environment variable is given and exists).
+ * - If neither of the above conditions is met, the default data is returned.
+ *
+ * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.
+ */
+abstract contract StdChains {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ bool private stdChainsInitialized;
+
+ struct ChainData {
+ string name;
+ uint256 chainId;
+ string rpcUrl;
+ }
+
+ struct Chain {
+ // The chain name.
+ string name;
+ // The chain's Chain ID.
+ uint256 chainId;
+ // The chain's alias. (i.e. what gets specified in `foundry.toml`).
+ string chainAlias;
+ // A default RPC endpoint for this chain.
+ // NOTE: This default RPC URL is included for convenience to facilitate quick tests and
+ // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy
+ // usage as you will be throttled and this is a disservice to others who need this endpoint.
+ string rpcUrl;
+ }
+
+ // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.
+ mapping(string => Chain) private chains;
+ // Maps from the chain's alias to it's default RPC URL.
+ mapping(string => string) private defaultRpcUrls;
+ // Maps from a chain ID to it's alias.
+ mapping(uint256 => string) private idToAlias;
+
+ bool private fallbackToDefaultRpcUrls = true;
+
+ // The RPC URL will be fetched from config or defaultRpcUrls if possible.
+ function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {
+ require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string.");
+
+ initializeStdChains();
+ chain = chains[chainAlias];
+ require(
+ chain.chainId != 0,
+ string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found."))
+ );
+
+ chain = getChainWithUpdatedRpcUrl(chainAlias, chain);
+ }
+
+ function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {
+ require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0.");
+ initializeStdChains();
+ string memory chainAlias = idToAlias[chainId];
+
+ chain = chains[chainAlias];
+
+ require(
+ chain.chainId != 0,
+ string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found."))
+ );
+
+ chain = getChainWithUpdatedRpcUrl(chainAlias, chain);
+ }
+
+ // set chain info, with priority to argument's rpcUrl field.
+ function setChain(string memory chainAlias, ChainData memory chain) internal virtual {
+ require(
+ bytes(chainAlias).length != 0,
+ "StdChains setChain(string,ChainData): Chain alias cannot be the empty string."
+ );
+
+ require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0.");
+
+ initializeStdChains();
+ string memory foundAlias = idToAlias[chain.chainId];
+
+ require(
+ bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),
+ string(
+ abi.encodePacked(
+ "StdChains setChain(string,ChainData): Chain ID ",
+ vm.toString(chain.chainId),
+ " already used by \"",
+ foundAlias,
+ "\"."
+ )
+ )
+ );
+
+ uint256 oldChainId = chains[chainAlias].chainId;
+ delete idToAlias[oldChainId];
+
+ chains[chainAlias] =
+ Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});
+ idToAlias[chain.chainId] = chainAlias;
+ }
+
+ // set chain info, with priority to argument's rpcUrl field.
+ function setChain(string memory chainAlias, Chain memory chain) internal virtual {
+ setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));
+ }
+
+ function _toUpper(string memory str) private pure returns (string memory) {
+ bytes memory strb = bytes(str);
+ bytes memory copy = new bytes(strb.length);
+ for (uint256 i = 0; i < strb.length; i++) {
+ bytes1 b = strb[i];
+ if (b >= 0x61 && b <= 0x7A) {
+ copy[i] = bytes1(uint8(b) - 32);
+ } else {
+ copy[i] = b;
+ }
+ }
+ return string(copy);
+ }
+
+ // lookup rpcUrl, in descending order of priority:
+ // current -> config (foundry.toml) -> environment variable -> default
+ function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain)
+ private
+ view
+ returns (Chain memory)
+ {
+ if (bytes(chain.rpcUrl).length == 0) {
+ try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {
+ chain.rpcUrl = configRpcUrl;
+ } catch (bytes memory err) {
+ string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL"));
+ if (fallbackToDefaultRpcUrls) {
+ chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);
+ } else {
+ chain.rpcUrl = vm.envString(envName);
+ }
+ // Distinguish 'not found' from 'cannot read'
+ // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions
+ bytes memory oldNotFoundError =
+ abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias)));
+ bytes memory newNotFoundError = abi.encodeWithSignature(
+ "CheatcodeError(string)", string(abi.encodePacked("invalid rpc url: ", chainAlias))
+ );
+ bytes32 errHash = keccak256(err);
+ if (
+ (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError))
+ || bytes(chain.rpcUrl).length == 0
+ ) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ revert(add(32, err), mload(err))
+ }
+ }
+ }
+ }
+ return chain;
+ }
+
+ function setFallbackToDefaultRpcUrls(bool useDefault) internal {
+ fallbackToDefaultRpcUrls = useDefault;
+ }
+
+ function initializeStdChains() private {
+ if (stdChainsInitialized) return;
+
+ stdChainsInitialized = true;
+
+ // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`
+ setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545"));
+ setChainWithDefaultRpcUrl("mainnet", ChainData("Mainnet", 1, "https://eth.llamarpc.com"));
+ setChainWithDefaultRpcUrl(
+ "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001")
+ );
+ setChainWithDefaultRpcUrl("holesky", ChainData("Holesky", 17000, "https://rpc.holesky.ethpandaops.io"));
+ setChainWithDefaultRpcUrl("hoodi", ChainData("Hoodi", 560048, "https://rpc.hoodi.ethpandaops.io"));
+ setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io"));
+ setChainWithDefaultRpcUrl(
+ "optimism_sepolia", ChainData("Optimism Sepolia", 11155420, "https://sepolia.optimism.io")
+ );
+ setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc"));
+ setChainWithDefaultRpcUrl(
+ "arbitrum_one_sepolia", ChainData("Arbitrum One Sepolia", 421614, "https://sepolia-rollup.arbitrum.io/rpc")
+ );
+ setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc"));
+ setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com"));
+ setChainWithDefaultRpcUrl(
+ "polygon_amoy", ChainData("Polygon Amoy", 80002, "https://rpc-amoy.polygon.technology")
+ );
+ setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc"));
+ setChainWithDefaultRpcUrl(
+ "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc")
+ );
+ setChainWithDefaultRpcUrl(
+ "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org")
+ );
+ setChainWithDefaultRpcUrl(
+ "bnb_smart_chain_testnet",
+ ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel")
+ );
+ setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com"));
+ setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network"));
+ setChainWithDefaultRpcUrl(
+ "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network")
+ );
+ setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network"));
+ setChainWithDefaultRpcUrl("base_sepolia", ChainData("Base Sepolia", 84532, "https://sepolia.base.org"));
+ setChainWithDefaultRpcUrl("base", ChainData("Base", 8453, "https://mainnet.base.org"));
+ setChainWithDefaultRpcUrl("blast_sepolia", ChainData("Blast Sepolia", 168587773, "https://sepolia.blast.io"));
+ setChainWithDefaultRpcUrl("blast", ChainData("Blast", 81457, "https://rpc.blast.io"));
+ setChainWithDefaultRpcUrl("fantom_opera", ChainData("Fantom Opera", 250, "https://rpc.ankr.com/fantom/"));
+ setChainWithDefaultRpcUrl(
+ "fantom_opera_testnet", ChainData("Fantom Opera Testnet", 4002, "https://rpc.ankr.com/fantom_testnet/")
+ );
+ setChainWithDefaultRpcUrl("fraxtal", ChainData("Fraxtal", 252, "https://rpc.frax.com"));
+ setChainWithDefaultRpcUrl("fraxtal_testnet", ChainData("Fraxtal Testnet", 2522, "https://rpc.testnet.frax.com"));
+ setChainWithDefaultRpcUrl(
+ "berachain_bartio_testnet", ChainData("Berachain bArtio Testnet", 80084, "https://bartio.rpc.berachain.com")
+ );
+ setChainWithDefaultRpcUrl("flare", ChainData("Flare", 14, "https://flare-api.flare.network/ext/C/rpc"));
+ setChainWithDefaultRpcUrl(
+ "flare_coston2", ChainData("Flare Coston2", 114, "https://coston2-api.flare.network/ext/C/rpc")
+ );
+
+ setChainWithDefaultRpcUrl("mode", ChainData("Mode", 34443, "https://mode.drpc.org"));
+ setChainWithDefaultRpcUrl("mode_sepolia", ChainData("Mode Sepolia", 919, "https://sepolia.mode.network"));
+
+ setChainWithDefaultRpcUrl("zora", ChainData("Zora", 7777777, "https://zora.drpc.org"));
+ setChainWithDefaultRpcUrl(
+ "zora_sepolia", ChainData("Zora Sepolia", 999999999, "https://sepolia.rpc.zora.energy")
+ );
+
+ setChainWithDefaultRpcUrl("race", ChainData("Race", 6805, "https://racemainnet.io"));
+ setChainWithDefaultRpcUrl("race_sepolia", ChainData("Race Sepolia", 6806, "https://racemainnet.io"));
+
+ setChainWithDefaultRpcUrl("metal", ChainData("Metal", 1750, "https://metall2.drpc.org"));
+ setChainWithDefaultRpcUrl("metal_sepolia", ChainData("Metal Sepolia", 1740, "https://testnet.rpc.metall2.com"));
+
+ setChainWithDefaultRpcUrl("binary", ChainData("Binary", 624, "https://rpc.zero.thebinaryholdings.com"));
+ setChainWithDefaultRpcUrl(
+ "binary_sepolia", ChainData("Binary Sepolia", 625, "https://rpc.zero.thebinaryholdings.com")
+ );
+
+ setChainWithDefaultRpcUrl("orderly", ChainData("Orderly", 291, "https://rpc.orderly.network"));
+ setChainWithDefaultRpcUrl(
+ "orderly_sepolia", ChainData("Orderly Sepolia", 4460, "https://testnet-rpc.orderly.org")
+ );
+ }
+
+ // set chain info, with priority to chainAlias' rpc url in foundry.toml
+ function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {
+ string memory rpcUrl = chain.rpcUrl;
+ defaultRpcUrls[chainAlias] = rpcUrl;
+ chain.rpcUrl = "";
+ setChain(chainAlias, chain);
+ chain.rpcUrl = rpcUrl; // restore argument
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdCheats.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdCheats.sol
new file mode 100644
index 000000000..9f360dec2
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdCheats.sol
@@ -0,0 +1,829 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {StdStorage, stdStorage} from "./StdStorage.sol";
+import {console2} from "./console2.sol";
+import {Vm} from "./Vm.sol";
+
+abstract contract StdCheatsSafe {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ uint256 private constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ bool private gasMeteringOff;
+
+ // Data structures to parse Transaction objects from the broadcast artifact
+ // that conform to EIP1559. The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct RawTx1559 {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ // json value name = function
+ string functionSig;
+ bytes32 hash;
+ // json value name = tx
+ RawTx1559Detail txDetail;
+ // json value name = type
+ string opcode;
+ }
+
+ struct RawTx1559Detail {
+ AccessList[] accessList;
+ bytes data;
+ address from;
+ bytes gas;
+ bytes nonce;
+ address to;
+ bytes txType;
+ bytes value;
+ }
+
+ struct Tx1559 {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ string functionSig;
+ bytes32 hash;
+ Tx1559Detail txDetail;
+ string opcode;
+ }
+
+ struct Tx1559Detail {
+ AccessList[] accessList;
+ bytes data;
+ address from;
+ uint256 gas;
+ uint256 nonce;
+ address to;
+ uint256 txType;
+ uint256 value;
+ }
+
+ // Data structures to parse Transaction objects from the broadcast artifact
+ // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct TxLegacy {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ string functionSig;
+ string hash;
+ string opcode;
+ TxDetailLegacy transaction;
+ }
+
+ struct TxDetailLegacy {
+ AccessList[] accessList;
+ uint256 chainId;
+ bytes data;
+ address from;
+ uint256 gas;
+ uint256 gasPrice;
+ bytes32 hash;
+ uint256 nonce;
+ bytes1 opcode;
+ bytes32 r;
+ bytes32 s;
+ uint256 txType;
+ address to;
+ uint8 v;
+ uint256 value;
+ }
+
+ struct AccessList {
+ address accessAddress;
+ bytes32[] storageKeys;
+ }
+
+ // Data structures to parse Receipt objects from the broadcast artifact.
+ // The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct RawReceipt {
+ bytes32 blockHash;
+ bytes blockNumber;
+ address contractAddress;
+ bytes cumulativeGasUsed;
+ bytes effectiveGasPrice;
+ address from;
+ bytes gasUsed;
+ RawReceiptLog[] logs;
+ bytes logsBloom;
+ bytes status;
+ address to;
+ bytes32 transactionHash;
+ bytes transactionIndex;
+ }
+
+ struct Receipt {
+ bytes32 blockHash;
+ uint256 blockNumber;
+ address contractAddress;
+ uint256 cumulativeGasUsed;
+ uint256 effectiveGasPrice;
+ address from;
+ uint256 gasUsed;
+ ReceiptLog[] logs;
+ bytes logsBloom;
+ uint256 status;
+ address to;
+ bytes32 transactionHash;
+ uint256 transactionIndex;
+ }
+
+ // Data structures to parse the entire broadcast artifact, assuming the
+ // transactions conform to EIP1559.
+
+ struct EIP1559ScriptArtifact {
+ string[] libraries;
+ string path;
+ string[] pending;
+ Receipt[] receipts;
+ uint256 timestamp;
+ Tx1559[] transactions;
+ TxReturn[] txReturns;
+ }
+
+ struct RawEIP1559ScriptArtifact {
+ string[] libraries;
+ string path;
+ string[] pending;
+ RawReceipt[] receipts;
+ TxReturn[] txReturns;
+ uint256 timestamp;
+ RawTx1559[] transactions;
+ }
+
+ struct RawReceiptLog {
+ // json value = address
+ address logAddress;
+ bytes32 blockHash;
+ bytes blockNumber;
+ bytes data;
+ bytes logIndex;
+ bool removed;
+ bytes32[] topics;
+ bytes32 transactionHash;
+ bytes transactionIndex;
+ bytes transactionLogIndex;
+ }
+
+ struct ReceiptLog {
+ // json value = address
+ address logAddress;
+ bytes32 blockHash;
+ uint256 blockNumber;
+ bytes data;
+ uint256 logIndex;
+ bytes32[] topics;
+ uint256 transactionIndex;
+ uint256 transactionLogIndex;
+ bool removed;
+ }
+
+ struct TxReturn {
+ string internalType;
+ string value;
+ }
+
+ struct Account {
+ address addr;
+ uint256 key;
+ }
+
+ enum AddressType {
+ Payable,
+ NonPayable,
+ ZeroAddress,
+ Precompile,
+ ForgeAddress
+ }
+
+ // Checks that `addr` is not blacklisted by token contracts that have a blacklist.
+ function assumeNotBlacklisted(address token, address addr) internal view virtual {
+ // Nothing to check if `token` is not a contract.
+ uint256 tokenCodeSize;
+ assembly {
+ tokenCodeSize := extcodesize(token)
+ }
+ require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.");
+
+ bool success;
+ bytes memory returnData;
+
+ // 4-byte selector for `isBlacklisted(address)`, used by USDC.
+ (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));
+ vm.assume(!success || abi.decode(returnData, (bool)) == false);
+
+ // 4-byte selector for `isBlackListed(address)`, used by USDT.
+ (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));
+ vm.assume(!success || abi.decode(returnData, (bool)) == false);
+ }
+
+ // Checks that `addr` is not blacklisted by token contracts that have a blacklist.
+ // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for
+ // backwards compatibility, since this name was used in the original PR which already has
+ // a release. This function can be removed in a future release once we want a breaking change.
+ function assumeNoBlacklisted(address token, address addr) internal view virtual {
+ assumeNotBlacklisted(token, addr);
+ }
+
+ function assumeAddressIsNot(address addr, AddressType addressType) internal virtual {
+ if (addressType == AddressType.Payable) {
+ assumeNotPayable(addr);
+ } else if (addressType == AddressType.NonPayable) {
+ assumePayable(addr);
+ } else if (addressType == AddressType.ZeroAddress) {
+ assumeNotZeroAddress(addr);
+ } else if (addressType == AddressType.Precompile) {
+ assumeNotPrecompile(addr);
+ } else if (addressType == AddressType.ForgeAddress) {
+ assumeNotForgeAddress(addr);
+ }
+ }
+
+ function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ }
+
+ function assumeAddressIsNot(
+ address addr,
+ AddressType addressType1,
+ AddressType addressType2,
+ AddressType addressType3
+ ) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ assumeAddressIsNot(addr, addressType3);
+ }
+
+ function assumeAddressIsNot(
+ address addr,
+ AddressType addressType1,
+ AddressType addressType2,
+ AddressType addressType3,
+ AddressType addressType4
+ ) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ assumeAddressIsNot(addr, addressType3);
+ assumeAddressIsNot(addr, addressType4);
+ }
+
+ // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to
+ // `addr` and checking the `success` return value.
+ // NOTE: This function may result in state changes depending on the fallback/receive logic
+ // implemented by `addr`, which should be taken into account when this function is used.
+ function _isPayable(address addr) private returns (bool) {
+ require(
+ addr.balance < UINT256_MAX,
+ "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds"
+ );
+ uint256 origBalanceTest = address(this).balance;
+ uint256 origBalanceAddr = address(addr).balance;
+
+ vm.deal(address(this), 1);
+ (bool success,) = payable(addr).call{value: 1}("");
+
+ // reset balances
+ vm.deal(address(this), origBalanceTest);
+ vm.deal(addr, origBalanceAddr);
+
+ return success;
+ }
+
+ // NOTE: This function may result in state changes depending on the fallback/receive logic
+ // implemented by `addr`, which should be taken into account when this function is used. See the
+ // `_isPayable` method for more information.
+ function assumePayable(address addr) internal virtual {
+ vm.assume(_isPayable(addr));
+ }
+
+ function assumeNotPayable(address addr) internal virtual {
+ vm.assume(!_isPayable(addr));
+ }
+
+ function assumeNotZeroAddress(address addr) internal pure virtual {
+ vm.assume(addr != address(0));
+ }
+
+ function assumeNotPrecompile(address addr) internal pure virtual {
+ assumeNotPrecompile(addr, _pureChainId());
+ }
+
+ function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual {
+ // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific
+ // address), but the same rationale for excluding them applies so we include those too.
+
+ // These are reserved by Ethereum and may be on all EVM-compatible chains.
+ vm.assume(addr < address(0x1) || addr > address(0xff));
+
+ // forgefmt: disable-start
+ if (chainId == 10 || chainId == 420) {
+ // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21
+ vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));
+ } else if (chainId == 42161 || chainId == 421613) {
+ // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains
+ vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));
+ } else if (chainId == 43114 || chainId == 43113) {
+ // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59
+ vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));
+ vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));
+ vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));
+ }
+ // forgefmt: disable-end
+ }
+
+ function assumeNotForgeAddress(address addr) internal pure virtual {
+ // vm, console, and Create2Deployer addresses
+ vm.assume(
+ addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67
+ && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C
+ );
+ }
+
+ function assumeUnusedAddress(address addr) internal view virtual {
+ uint256 size;
+ assembly {
+ size := extcodesize(addr)
+ }
+ vm.assume(size == 0);
+
+ assumeNotPrecompile(addr);
+ assumeNotZeroAddress(addr);
+ assumeNotForgeAddress(addr);
+ }
+
+ function readEIP1559ScriptArtifact(string memory path)
+ internal
+ view
+ virtual
+ returns (EIP1559ScriptArtifact memory)
+ {
+ string memory data = vm.readFile(path);
+ bytes memory parsedData = vm.parseJson(data);
+ RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));
+ EIP1559ScriptArtifact memory artifact;
+ artifact.libraries = rawArtifact.libraries;
+ artifact.path = rawArtifact.path;
+ artifact.timestamp = rawArtifact.timestamp;
+ artifact.pending = rawArtifact.pending;
+ artifact.txReturns = rawArtifact.txReturns;
+ artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);
+ artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);
+ return artifact;
+ }
+
+ function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {
+ Tx1559[] memory txs = new Tx1559[](rawTxs.length);
+ for (uint256 i; i < rawTxs.length; i++) {
+ txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);
+ }
+ return txs;
+ }
+
+ function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {
+ Tx1559 memory transaction;
+ transaction.arguments = rawTx.arguments;
+ transaction.contractName = rawTx.contractName;
+ transaction.functionSig = rawTx.functionSig;
+ transaction.hash = rawTx.hash;
+ transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);
+ transaction.opcode = rawTx.opcode;
+ return transaction;
+ }
+
+ function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)
+ internal
+ pure
+ virtual
+ returns (Tx1559Detail memory)
+ {
+ Tx1559Detail memory txDetail;
+ txDetail.data = rawDetail.data;
+ txDetail.from = rawDetail.from;
+ txDetail.to = rawDetail.to;
+ txDetail.nonce = _bytesToUint(rawDetail.nonce);
+ txDetail.txType = _bytesToUint(rawDetail.txType);
+ txDetail.value = _bytesToUint(rawDetail.value);
+ txDetail.gas = _bytesToUint(rawDetail.gas);
+ txDetail.accessList = rawDetail.accessList;
+ return txDetail;
+ }
+
+ function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {
+ string memory deployData = vm.readFile(path);
+ bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions");
+ RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));
+ return rawToConvertedEIPTx1559s(rawTxs);
+ }
+
+ function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {
+ string memory deployData = vm.readFile(path);
+ string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]"));
+ bytes memory parsedDeployData = vm.parseJson(deployData, key);
+ RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));
+ return rawToConvertedEIPTx1559(rawTx);
+ }
+
+ // Analogous to readTransactions, but for receipts.
+ function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {
+ string memory deployData = vm.readFile(path);
+ bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts");
+ RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));
+ return rawToConvertedReceipts(rawReceipts);
+ }
+
+ function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {
+ string memory deployData = vm.readFile(path);
+ string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]"));
+ bytes memory parsedDeployData = vm.parseJson(deployData, key);
+ RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));
+ return rawToConvertedReceipt(rawReceipt);
+ }
+
+ function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {
+ Receipt[] memory receipts = new Receipt[](rawReceipts.length);
+ for (uint256 i; i < rawReceipts.length; i++) {
+ receipts[i] = rawToConvertedReceipt(rawReceipts[i]);
+ }
+ return receipts;
+ }
+
+ function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {
+ Receipt memory receipt;
+ receipt.blockHash = rawReceipt.blockHash;
+ receipt.to = rawReceipt.to;
+ receipt.from = rawReceipt.from;
+ receipt.contractAddress = rawReceipt.contractAddress;
+ receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);
+ receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);
+ receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);
+ receipt.status = _bytesToUint(rawReceipt.status);
+ receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);
+ receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);
+ receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);
+ receipt.logsBloom = rawReceipt.logsBloom;
+ receipt.transactionHash = rawReceipt.transactionHash;
+ return receipt;
+ }
+
+ function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)
+ internal
+ pure
+ virtual
+ returns (ReceiptLog[] memory)
+ {
+ ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);
+ for (uint256 i; i < rawLogs.length; i++) {
+ logs[i].logAddress = rawLogs[i].logAddress;
+ logs[i].blockHash = rawLogs[i].blockHash;
+ logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);
+ logs[i].data = rawLogs[i].data;
+ logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);
+ logs[i].topics = rawLogs[i].topics;
+ logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);
+ logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);
+ logs[i].removed = rawLogs[i].removed;
+ }
+ return logs;
+ }
+
+ // Deploy a contract by fetching the contract bytecode from
+ // the artifacts directory
+ // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`
+ function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {
+ bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed.");
+ }
+
+ function deployCode(string memory what) internal virtual returns (address addr) {
+ bytes memory bytecode = vm.getCode(what);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string): Deployment failed.");
+ }
+
+ /// @dev deploy contract with value on construction
+ function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {
+ bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(val, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed.");
+ }
+
+ function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {
+ bytes memory bytecode = vm.getCode(what);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(val, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed.");
+ }
+
+ // creates a labeled address and the corresponding private key
+ function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {
+ privateKey = uint256(keccak256(abi.encodePacked(name)));
+ addr = vm.addr(privateKey);
+ vm.label(addr, name);
+ }
+
+ // creates a labeled address
+ function makeAddr(string memory name) internal virtual returns (address addr) {
+ (addr,) = makeAddrAndKey(name);
+ }
+
+ // Destroys an account immediately, sending the balance to beneficiary.
+ // Destroying means: balance will be zero, code will be empty, and nonce will be 0
+ // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce
+ // only after tx ends, this will run immediately.
+ function destroyAccount(address who, address beneficiary) internal virtual {
+ uint256 currBalance = who.balance;
+ vm.etch(who, abi.encode());
+ vm.deal(who, 0);
+ vm.resetNonce(who);
+
+ uint256 beneficiaryBalance = beneficiary.balance;
+ vm.deal(beneficiary, currBalance + beneficiaryBalance);
+ }
+
+ // creates a struct containing both a labeled address and the corresponding private key
+ function makeAccount(string memory name) internal virtual returns (Account memory account) {
+ (account.addr, account.key) = makeAddrAndKey(name);
+ }
+
+ function deriveRememberKey(string memory mnemonic, uint32 index)
+ internal
+ virtual
+ returns (address who, uint256 privateKey)
+ {
+ privateKey = vm.deriveKey(mnemonic, index);
+ who = vm.rememberKey(privateKey);
+ }
+
+ function _bytesToUint(bytes memory b) private pure returns (uint256) {
+ require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32.");
+ return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));
+ }
+
+ function isFork() internal view virtual returns (bool status) {
+ try vm.activeFork() {
+ status = true;
+ } catch (bytes memory) {}
+ }
+
+ modifier skipWhenForking() {
+ if (!isFork()) {
+ _;
+ }
+ }
+
+ modifier skipWhenNotForking() {
+ if (isFork()) {
+ _;
+ }
+ }
+
+ modifier noGasMetering() {
+ vm.pauseGasMetering();
+ // To prevent turning gas monitoring back on with nested functions that use this modifier,
+ // we check if gasMetering started in the off position. If it did, we don't want to turn
+ // it back on until we exit the top level function that used the modifier
+ //
+ // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.
+ // funcA will have `gasStartedOff` as false, funcB will have it as true,
+ // so we only turn metering back on at the end of the funcA
+ bool gasStartedOff = gasMeteringOff;
+ gasMeteringOff = true;
+
+ _;
+
+ // if gas metering was on when this modifier was called, turn it back on at the end
+ if (!gasStartedOff) {
+ gasMeteringOff = false;
+ vm.resumeGasMetering();
+ }
+ }
+
+ // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no
+ // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We
+ // can't simply access the chain ID in a normal view or pure function because the solc View Pure
+ // Checker changed `chainid` from pure to view in 0.8.0.
+ function _viewChainId() private view returns (uint256 chainId) {
+ // Assembly required since `block.chainid` was introduced in 0.8.0.
+ assembly {
+ chainId := chainid()
+ }
+
+ address(this); // Silence warnings in older Solc versions.
+ }
+
+ function _pureChainId() private pure returns (uint256 chainId) {
+ function() internal view returns (uint256) fnIn = _viewChainId;
+ function() internal pure returns (uint256) pureChainId;
+ assembly {
+ pureChainId := fnIn
+ }
+ chainId = pureChainId();
+ }
+}
+
+// Wrappers around cheatcodes to avoid footguns
+abstract contract StdCheats is StdCheatsSafe {
+ using stdStorage for StdStorage;
+
+ StdStorage private stdstore;
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+ address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
+
+ // Skip forward or rewind time by the specified number of seconds
+ function skip(uint256 time) internal virtual {
+ vm.warp(vm.getBlockTimestamp() + time);
+ }
+
+ function rewind(uint256 time) internal virtual {
+ vm.warp(vm.getBlockTimestamp() - time);
+ }
+
+ // Setup a prank from an address that has some ether
+ function hoax(address msgSender) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.prank(msgSender);
+ }
+
+ function hoax(address msgSender, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.prank(msgSender);
+ }
+
+ function hoax(address msgSender, address origin) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.prank(msgSender, origin);
+ }
+
+ function hoax(address msgSender, address origin, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.prank(msgSender, origin);
+ }
+
+ // Start perpetual prank from an address that has some ether
+ function startHoax(address msgSender) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.startPrank(msgSender);
+ }
+
+ function startHoax(address msgSender, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.startPrank(msgSender);
+ }
+
+ // Start perpetual prank from an address that has some ether
+ // tx.origin is set to the origin parameter
+ function startHoax(address msgSender, address origin) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.startPrank(msgSender, origin);
+ }
+
+ function startHoax(address msgSender, address origin, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.startPrank(msgSender, origin);
+ }
+
+ function changePrank(address msgSender) internal virtual {
+ console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead.");
+ vm.stopPrank();
+ vm.startPrank(msgSender);
+ }
+
+ function changePrank(address msgSender, address txOrigin) internal virtual {
+ vm.stopPrank();
+ vm.startPrank(msgSender, txOrigin);
+ }
+
+ // The same as Vm's `deal`
+ // Use the alternative signature for ERC20 tokens
+ function deal(address to, uint256 give) internal virtual {
+ vm.deal(to, give);
+ }
+
+ // Set the balance of an account for any ERC20 token
+ // Use the alternative signature to update `totalSupply`
+ function deal(address token, address to, uint256 give) internal virtual {
+ deal(token, to, give, false);
+ }
+
+ // Set the balance of an account for any ERC1155 token
+ // Use the alternative signature to update `totalSupply`
+ function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {
+ dealERC1155(token, to, id, give, false);
+ }
+
+ function deal(address token, address to, uint256 give, bool adjust) internal virtual {
+ // get current balance
+ (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));
+ uint256 prevBal = abi.decode(balData, (uint256));
+
+ // update balance
+ stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);
+
+ // update total supply
+ if (adjust) {
+ (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));
+ uint256 totSup = abi.decode(totSupData, (uint256));
+ if (give < prevBal) {
+ totSup -= (prevBal - give);
+ } else {
+ totSup += (give - prevBal);
+ }
+ stdstore.target(token).sig(0x18160ddd).checked_write(totSup);
+ }
+ }
+
+ function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {
+ // get current balance
+ (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));
+ uint256 prevBal = abi.decode(balData, (uint256));
+
+ // update balance
+ stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);
+
+ // update total supply
+ if (adjust) {
+ (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));
+ require(
+ totSupData.length != 0,
+ "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply."
+ );
+ uint256 totSup = abi.decode(totSupData, (uint256));
+ if (give < prevBal) {
+ totSup -= (prevBal - give);
+ } else {
+ totSup += (give - prevBal);
+ }
+ stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);
+ }
+ }
+
+ function dealERC721(address token, address to, uint256 id) internal virtual {
+ // check if token id is already minted and the actual owner.
+ (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));
+ require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted.");
+
+ // get owner current balance
+ (, bytes memory fromBalData) =
+ token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));
+ uint256 fromPrevBal = abi.decode(fromBalData, (uint256));
+
+ // get new user current balance
+ (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));
+ uint256 toPrevBal = abi.decode(toBalData, (uint256));
+
+ // update balances
+ stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);
+ stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);
+
+ // update owner
+ stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);
+ }
+
+ function deployCodeTo(string memory what, address where) internal virtual {
+ deployCodeTo(what, "", 0, where);
+ }
+
+ function deployCodeTo(string memory what, bytes memory args, address where) internal virtual {
+ deployCodeTo(what, args, 0, where);
+ }
+
+ function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual {
+ bytes memory creationCode = vm.getCode(what);
+ vm.etch(where, abi.encodePacked(creationCode, args));
+ (bool success, bytes memory runtimeBytecode) = where.call{value: value}("");
+ require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.");
+ vm.etch(where, runtimeBytecode);
+ }
+
+ // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.
+ function console2_log_StdCheats(string memory p0) private view {
+ (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0));
+ status;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdConfig.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdConfig.sol
new file mode 100644
index 000000000..506ac34a5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdConfig.sol
@@ -0,0 +1,612 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.13;
+
+import {VmSafe} from "./Vm.sol";
+import {Variable, Type, TypeKind, LibVariable} from "./LibVariable.sol";
+
+/// @notice A contract that parses a toml configuration file and load its
+/// variables into storage, automatically casting them, on deployment.
+///
+/// @dev This contract assumes a toml structure where top-level keys
+/// represent chain ids or aliases. Under each chain key, variables are
+/// organized by type in separate sub-tables like `[.]`, where
+/// type must be: `bool`, `address`, `bytes32`, `uint`, `ìnt`, `string`, or `bytes`.
+///
+/// Supported format:
+/// ```
+/// [mainnet]
+/// endpoint_url = "${MAINNET_RPC}"
+///
+/// [mainnet.bool]
+/// is_live = true
+///
+/// [mainnet.address]
+/// weth = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
+/// whitelisted_admins = [
+/// "${MAINNET_ADMIN}",
+/// "0x00000000000000000000000000000000deadbeef",
+/// "0x000000000000000000000000000000c0ffeebabe"
+/// ]
+///
+/// [mainnet.uint]
+/// important_number = 123
+/// ```
+contract StdConfig {
+ using LibVariable for Type;
+ using LibVariable for TypeKind;
+
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ /// @dev Types: `bool`, `address`, `bytes32`, `uint`, `ìnt`, `string`, `bytes`.
+ uint8 private constant NUM_TYPES = 7;
+
+ // -- ERRORS ---------------------------------------------------------------
+
+ error AlreadyInitialized(string key);
+ error InvalidChainKey(string aliasOrId);
+ error ChainNotInitialized(uint256 chainId);
+ error UnableToParseVariable(string key);
+ error WriteToFileInForbiddenCtxt();
+
+ // -- STORAGE (CACHE FROM CONFIG FILE) ------------------------------------
+
+ /// @dev Path to the loaded TOML configuration file.
+ string private _filePath;
+
+ /// @dev List of top-level keys found in the TOML file, assumed to be chain names/aliases.
+ string[] private _chainKeys;
+
+ /// @dev Storage for the configured RPC URL for each chain.
+ mapping(uint256 => string) private _rpcOf;
+
+ /// @dev Storage for values, organized by chain ID and variable key.
+ mapping(uint256 => mapping(string => bytes)) private _dataOf;
+
+ /// @dev Type cache for runtime checking when casting.
+ mapping(uint256 => mapping(string => Type)) private _typeOf;
+
+ /// @dev When enabled, `set` will always write updates back to the configuration file.
+ /// Can only be enabled in a scripting context to prevent file corruption from
+ /// concurrent I/O access, as tests run in parallel.
+ bool private _writeToFile;
+
+ // -- CONSTRUCTOR ----------------------------------------------------------
+
+ /// @notice Reads the TOML file and iterates through each top-level key, which is
+ /// assumed to be a chain name or ID. For each chain, it caches its RPC
+ /// endpoint and all variables defined in typed sub-tables like `[.]`,
+ /// where type must be: `bool`, `address`, `uint`, `bytes32`, `string`, or `bytes`.
+ ///
+ /// The constructor attempts to parse each variable first as a single value,
+ /// and if that fails, as an array of that type. If a variable cannot be
+ /// parsed as either, the constructor will revert with an error.
+ ///
+ /// @param configFilePath: The local path to the TOML configuration file.
+ /// @param writeToFile: Whether to write updates back to the TOML file. Only for scripts.
+ constructor(string memory configFilePath, bool writeToFile) {
+ if (writeToFile && !vm.isContext(VmSafe.ForgeContext.ScriptGroup)) {
+ revert WriteToFileInForbiddenCtxt();
+ }
+
+ _filePath = configFilePath;
+ _writeToFile = writeToFile;
+ string memory content = vm.resolveEnv(vm.readFile(configFilePath));
+ string[] memory chain_keys = vm.parseTomlKeys(content, "$");
+
+ // Cache the entire configuration to storage
+ for (uint256 i = 0; i < chain_keys.length; i++) {
+ string memory chain_key = chain_keys[i];
+ // Ignore top-level keys that are not tables
+ if (vm.parseTomlKeys(content, string.concat("$.", chain_key)).length == 0) {
+ continue;
+ }
+ uint256 chainId = resolveChainId(chain_key);
+ _chainKeys.push(chain_key);
+
+ // Cache the configure rpc endpoint for that chain.
+ // Falls back to `[rpc_endpoints]`. Panics if no rpc endpoint is configured.
+ try vm.parseTomlString(content, string.concat("$.", chain_key, ".endpoint_url")) returns (string memory url)
+ {
+ _rpcOf[chainId] = vm.resolveEnv(url);
+ } catch {
+ _rpcOf[chainId] = vm.resolveEnv(vm.rpcUrl(chain_key));
+ }
+
+ // Iterate through all the available `TypeKind`s (except `None`) to create the sub-section paths
+ for (uint8 t = 1; t <= NUM_TYPES; t++) {
+ TypeKind ty = TypeKind(t);
+ string memory typePath = string.concat("$.", chain_key, ".", ty.toTomlKey());
+
+ try vm.parseTomlKeys(content, typePath) returns (string[] memory keys) {
+ for (uint256 j = 0; j < keys.length; j++) {
+ string memory key = keys[j];
+ if (_typeOf[chainId][key].kind == TypeKind.None) {
+ _loadAndCacheValue(content, string.concat(typePath, ".", key), chainId, key, ty);
+ } else {
+ revert AlreadyInitialized(key);
+ }
+ }
+ } catch {} // Section does not exist, ignore.
+ }
+ }
+ }
+
+ function _loadAndCacheValue(
+ string memory content,
+ string memory path,
+ uint256 chainId,
+ string memory key,
+ TypeKind ty
+ ) private {
+ bool success = false;
+ if (ty == TypeKind.Bool) {
+ try vm.parseTomlBool(content, path) returns (bool val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bool, false);
+ success = true;
+ } catch {
+ try vm.parseTomlBoolArray(content, path) returns (bool[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bool, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Address) {
+ try vm.parseTomlAddress(content, path) returns (address val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Address, false);
+ success = true;
+ } catch {
+ try vm.parseTomlAddressArray(content, path) returns (address[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Address, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Bytes32) {
+ try vm.parseTomlBytes32(content, path) returns (bytes32 val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bytes32, false);
+ success = true;
+ } catch {
+ try vm.parseTomlBytes32Array(content, path) returns (bytes32[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bytes32, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Uint256) {
+ try vm.parseTomlUint(content, path) returns (uint256 val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Uint256, false);
+ success = true;
+ } catch {
+ try vm.parseTomlUintArray(content, path) returns (uint256[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Uint256, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Int256) {
+ try vm.parseTomlInt(content, path) returns (int256 val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Int256, false);
+ success = true;
+ } catch {
+ try vm.parseTomlIntArray(content, path) returns (int256[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Int256, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.Bytes) {
+ try vm.parseTomlBytes(content, path) returns (bytes memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bytes, false);
+ success = true;
+ } catch {
+ try vm.parseTomlBytesArray(content, path) returns (bytes[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.Bytes, true);
+ success = true;
+ } catch {}
+ }
+ } else if (ty == TypeKind.String) {
+ try vm.parseTomlString(content, path) returns (string memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.String, false);
+ success = true;
+ } catch {
+ try vm.parseTomlStringArray(content, path) returns (string[] memory val) {
+ _dataOf[chainId][key] = abi.encode(val);
+ _typeOf[chainId][key] = Type(TypeKind.String, true);
+ success = true;
+ } catch {}
+ }
+ }
+
+ if (!success) {
+ revert UnableToParseVariable(key);
+ }
+ }
+
+ // -- HELPER FUNCTIONS -----------------------------------------------------
+
+ /// @notice Enable or disable automatic writing to the TOML file on `set`.
+ /// Can only be enabled when scripting.
+ function writeUpdatesBackToFile(bool enabled) public {
+ if (enabled && !vm.isContext(VmSafe.ForgeContext.ScriptGroup)) {
+ revert WriteToFileInForbiddenCtxt();
+ }
+
+ _writeToFile = enabled;
+ }
+
+ /// @notice Resolves a chain alias or a chain id string to its numerical chain id.
+ /// @param aliasOrId The string representing the chain alias (i.e. "mainnet") or a numerical ID (i.e. "1").
+ /// @return The numerical chain ID.
+ /// @dev It first attempts to parse the input as a number. If that fails, it uses `vm.getChain` to resolve a named alias.
+ /// Reverts if the alias is not valid or not a number.
+ function resolveChainId(string memory aliasOrId) public view returns (uint256) {
+ try vm.parseUint(aliasOrId) returns (uint256 chainId) {
+ return chainId;
+ } catch {
+ try vm.getChain(aliasOrId) returns (VmSafe.Chain memory chainInfo) {
+ return chainInfo.chainId;
+ } catch {
+ revert InvalidChainKey(aliasOrId);
+ }
+ }
+ }
+
+ /// @dev Retrieves the chain key/alias from the configuration based on the chain ID.
+ function _getChainKeyFromId(uint256 chainId) private view returns (string memory) {
+ for (uint256 i = 0; i < _chainKeys.length; i++) {
+ if (resolveChainId(_chainKeys[i]) == chainId) {
+ return _chainKeys[i];
+ }
+ }
+ revert ChainNotInitialized(chainId);
+ }
+
+ /// @dev Ensures type consistency when setting a value - prevents changing types unless uninitialized.
+ /// Updates type only when the previous type was `None`.
+ function _ensureTypeConsistency(uint256 chainId, string memory key, Type memory ty) private {
+ Type memory current = _typeOf[chainId][key];
+
+ if (current.kind == TypeKind.None) {
+ _typeOf[chainId][key] = ty;
+ } else {
+ current.assertEq(ty);
+ }
+ }
+
+ /// @dev Wraps a string in double quotes for JSON compatibility.
+ function _quote(string memory s) private pure returns (string memory) {
+ return string.concat('"', s, '"');
+ }
+
+ /// @dev Writes a JSON-formatted value to a specific key in the TOML file.
+ /// @param chainId The chain id to write under.
+ /// @param ty The type category ('bool', 'address', 'uint', 'bytes32', 'string', or 'bytes').
+ /// @param key The variable key name.
+ /// @param jsonValue The JSON-formatted value to write.
+ function _writeToToml(uint256 chainId, string memory ty, string memory key, string memory jsonValue) private {
+ string memory chainKey = _getChainKeyFromId(chainId);
+ string memory valueKey = string.concat("$.", chainKey, ".", ty, ".", key);
+ vm.writeToml(jsonValue, _filePath, valueKey);
+ }
+
+ // -- GETTER FUNCTIONS -----------------------------------------------------
+
+ /// @dev Reads a variable for a given chain id and key, and returns it in a generic container.
+ /// The caller should use `LibVariable` to safely coerce the type.
+ /// Example: `uint256 myVar = config.get("my_key").toUint256();`
+ ///
+ /// @param chain_id The chain ID to read from.
+ /// @param key The key of the variable to retrieve.
+ /// @return `Variable` struct containing the type and the ABI-encoded value.
+ function get(uint256 chain_id, string memory key) public view returns (Variable memory) {
+ return Variable(_typeOf[chain_id][key], _dataOf[chain_id][key]);
+ }
+
+ /// @dev Reads a variable for the current chain and a given key, and returns it in a generic container.
+ /// The caller should use `LibVariable` to safely coerce the type.
+ /// Example: `uint256 myVar = config.get("my_key").toUint256();`
+ ///
+ /// @param key The key of the variable to retrieve.
+ /// @return `Variable` struct containing the type and the ABI-encoded value.
+ function get(string memory key) public view returns (Variable memory) {
+ return get(vm.getChainId(), key);
+ }
+
+ /// @notice Returns the numerical chain ids for all configured chains.
+ function getChainIds() public view returns (uint256[] memory) {
+ string[] memory keys = _chainKeys;
+
+ uint256[] memory ids = new uint256[](keys.length);
+ for (uint256 i = 0; i < keys.length; i++) {
+ ids[i] = resolveChainId(keys[i]);
+ }
+
+ return ids;
+ }
+
+ /// @notice Reads the RPC URL for a specific chain id.
+ function getRpcUrl(uint256 chainId) public view returns (string memory) {
+ return _rpcOf[chainId];
+ }
+
+ /// @notice Reads the RPC URL for the current chain.
+ function getRpcUrl() public view returns (string memory) {
+ return _rpcOf[vm.getChainId()];
+ }
+
+ // -- SETTER FUNCTIONS (SINGLE VALUES) -------------------------------------
+
+ /// @notice Sets a boolean value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bool value) public {
+ Type memory ty = Type(TypeKind.Bool, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value));
+ }
+
+ /// @notice Sets a boolean value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bool value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets an address value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, address value) public {
+ Type memory ty = Type(TypeKind.Address, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value)));
+ }
+
+ /// @notice Sets an address value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, address value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a bytes32 value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bytes32 value) public {
+ Type memory ty = Type(TypeKind.Bytes32, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value)));
+ }
+
+ /// @notice Sets a bytes32 value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bytes32 value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a uint256 value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, uint256 value) public {
+ Type memory ty = Type(TypeKind.Uint256, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value));
+ }
+
+ /// @notice Sets a uint256 value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, uint256 value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets an int256 value for a given key and chain ID.
+ function set(uint256 chainId, string memory key, int256 value) public {
+ Type memory ty = Type(TypeKind.Int256, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value));
+ }
+
+ /// @notice Sets an int256 value for a given key on the current chain.
+ function set(string memory key, int256 value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a string value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, string memory value) public {
+ Type memory ty = Type(TypeKind.String, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(value));
+ }
+
+ /// @notice Sets a string value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, string memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a bytes value for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bytes memory value) public {
+ Type memory ty = Type(TypeKind.Bytes, false);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value)));
+ }
+
+ /// @notice Sets a bytes value for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bytes memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ // -- SETTER FUNCTIONS (ARRAYS) --------------------------------------------
+
+ /// @notice Sets a boolean array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bool[] memory value) public {
+ Type memory ty = Type(TypeKind.Bool, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, vm.toString(value[i]));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a boolean array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bool[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets an address array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, address[] memory value) public {
+ Type memory ty = Type(TypeKind.Address, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, _quote(vm.toString(value[i])));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets an address array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, address[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a bytes32 array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bytes32[] memory value) public {
+ Type memory ty = Type(TypeKind.Bytes32, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, _quote(vm.toString(value[i])));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a bytes32 array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bytes32[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a uint256 array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, uint256[] memory value) public {
+ Type memory ty = Type(TypeKind.Uint256, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, vm.toString(value[i]));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a uint256 array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, uint256[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a int256 array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, int256[] memory value) public {
+ Type memory ty = Type(TypeKind.Int256, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, vm.toString(value[i]));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a int256 array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, int256[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a string array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, string[] memory value) public {
+ Type memory ty = Type(TypeKind.String, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, _quote(value[i]));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a string array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, string[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+
+ /// @notice Sets a bytes array for a given key and chain ID.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(uint256 chainId, string memory key, bytes[] memory value) public {
+ Type memory ty = Type(TypeKind.Bytes, true);
+ _ensureTypeConsistency(chainId, key, ty);
+ _dataOf[chainId][key] = abi.encode(value);
+ if (_writeToFile) {
+ string memory json = "[";
+ for (uint256 i = 0; i < value.length; i++) {
+ json = string.concat(json, _quote(vm.toString(value[i])));
+ if (i < value.length - 1) json = string.concat(json, ",");
+ }
+ json = string.concat(json, "]");
+ _writeToToml(chainId, ty.kind.toTomlKey(), key, json);
+ }
+ }
+
+ /// @notice Sets a bytes array for a given key on the current chain.
+ /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled.
+ function set(string memory key, bytes[] memory value) public {
+ set(vm.getChainId(), key, value);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdConstants.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdConstants.sol
new file mode 100644
index 000000000..2047d2b33
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdConstants.sol
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {IMulticall3} from "./interfaces/IMulticall3.sol";
+import {Vm} from "./Vm.sol";
+
+library StdConstants {
+ /// @dev Cheat code address.
+ /// Calculated as `address(uint160(uint256(keccak256("hevm cheat code"))))`.
+ Vm internal constant VM = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+ /// @dev console.sol and console2.sol work by executing a staticcall to this address.
+ /// Calculated as `address(uint160(uint88(bytes11("console.log"))))`.
+ address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;
+ /// @dev Used when deploying with create2.
+ /// Taken from https://github.com/Arachnid/deterministic-deployment-proxy.
+ address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+ /// @dev The default address for tx.origin and msg.sender.
+ /// Calculated as `address(uint160(uint256(keccak256("foundry default caller"))))`.
+ address internal constant DEFAULT_SENDER = 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38;
+ /// @dev The address of the first contract `CREATE`d by a running test contract.
+ /// When running tests, each test contract is `CREATE`d by `DEFAULT_SENDER` with nonce 1.
+ /// Calculated as `VM.computeCreateAddress(VM.computeCreateAddress(DEFAULT_SENDER, 1), 1)`.
+ address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;
+ /// @dev Deterministic deployment address of the Multicall3 contract.
+ /// Taken from https://www.multicall3.com.
+ IMulticall3 internal constant MULTICALL3_ADDRESS = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);
+ /// @dev The order of the secp256k1 curve.
+ uint256 internal constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdError.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdError.sol
new file mode 100644
index 000000000..a302191fa
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdError.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test
+pragma solidity >=0.6.2 <0.9.0;
+
+library stdError {
+ bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01);
+ bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11);
+ bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12);
+ bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21);
+ bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22);
+ bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31);
+ bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32);
+ bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41);
+ bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdInvariant.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdInvariant.sol
new file mode 100644
index 000000000..056db98fc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdInvariant.sol
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+abstract contract StdInvariant {
+ struct FuzzSelector {
+ address addr;
+ bytes4[] selectors;
+ }
+
+ struct FuzzArtifactSelector {
+ string artifact;
+ bytes4[] selectors;
+ }
+
+ struct FuzzInterface {
+ address addr;
+ string[] artifacts;
+ }
+
+ address[] private _excludedContracts;
+ address[] private _excludedSenders;
+ address[] private _targetedContracts;
+ address[] private _targetedSenders;
+
+ string[] private _excludedArtifacts;
+ string[] private _targetedArtifacts;
+
+ FuzzArtifactSelector[] private _targetedArtifactSelectors;
+
+ FuzzSelector[] private _excludedSelectors;
+ FuzzSelector[] private _targetedSelectors;
+
+ FuzzInterface[] private _targetedInterfaces;
+
+ // Functions for users:
+ // These are intended to be called in tests.
+
+ function excludeContract(address newExcludedContract_) internal {
+ _excludedContracts.push(newExcludedContract_);
+ }
+
+ function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {
+ _excludedSelectors.push(newExcludedSelector_);
+ }
+
+ function excludeSender(address newExcludedSender_) internal {
+ _excludedSenders.push(newExcludedSender_);
+ }
+
+ function excludeArtifact(string memory newExcludedArtifact_) internal {
+ _excludedArtifacts.push(newExcludedArtifact_);
+ }
+
+ function targetArtifact(string memory newTargetedArtifact_) internal {
+ _targetedArtifacts.push(newTargetedArtifact_);
+ }
+
+ function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {
+ _targetedArtifactSelectors.push(newTargetedArtifactSelector_);
+ }
+
+ function targetContract(address newTargetedContract_) internal {
+ _targetedContracts.push(newTargetedContract_);
+ }
+
+ function targetSelector(FuzzSelector memory newTargetedSelector_) internal {
+ _targetedSelectors.push(newTargetedSelector_);
+ }
+
+ function targetSender(address newTargetedSender_) internal {
+ _targetedSenders.push(newTargetedSender_);
+ }
+
+ function targetInterface(FuzzInterface memory newTargetedInterface_) internal {
+ _targetedInterfaces.push(newTargetedInterface_);
+ }
+
+ // Functions for forge:
+ // These are called by forge to run invariant tests and don't need to be called in tests.
+
+ function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {
+ excludedArtifacts_ = _excludedArtifacts;
+ }
+
+ function excludeContracts() public view returns (address[] memory excludedContracts_) {
+ excludedContracts_ = _excludedContracts;
+ }
+
+ function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {
+ excludedSelectors_ = _excludedSelectors;
+ }
+
+ function excludeSenders() public view returns (address[] memory excludedSenders_) {
+ excludedSenders_ = _excludedSenders;
+ }
+
+ function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {
+ targetedArtifacts_ = _targetedArtifacts;
+ }
+
+ function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {
+ targetedArtifactSelectors_ = _targetedArtifactSelectors;
+ }
+
+ function targetContracts() public view returns (address[] memory targetedContracts_) {
+ targetedContracts_ = _targetedContracts;
+ }
+
+ function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {
+ targetedSelectors_ = _targetedSelectors;
+ }
+
+ function targetSenders() public view returns (address[] memory targetedSenders_) {
+ targetedSenders_ = _targetedSenders;
+ }
+
+ function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {
+ targetedInterfaces_ = _targetedInterfaces;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdJson.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdJson.sol
new file mode 100644
index 000000000..2a033c03a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdJson.sol
@@ -0,0 +1,283 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.0 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {VmSafe} from "./Vm.sol";
+
+// Helpers for parsing and writing JSON files
+// To parse:
+// ```
+// using stdJson for string;
+// string memory json = vm.readFile("");
+// json.readUint("");
+// ```
+// To write:
+// ```
+// using stdJson for string;
+// string memory json = "json";
+// json.serialize("a", uint256(123));
+// string memory semiFinal = json.serialize("b", string("test"));
+// string memory finalJson = json.serialize("c", semiFinal);
+// finalJson.write("");
+// ```
+
+library stdJson {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function keyExists(string memory json, string memory key) internal view returns (bool) {
+ return vm.keyExistsJson(json, key);
+ }
+
+ function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {
+ return vm.parseJson(json, key);
+ }
+
+ function readUint(string memory json, string memory key) internal pure returns (uint256) {
+ return vm.parseJsonUint(json, key);
+ }
+
+ function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {
+ return vm.parseJsonUintArray(json, key);
+ }
+
+ function readInt(string memory json, string memory key) internal pure returns (int256) {
+ return vm.parseJsonInt(json, key);
+ }
+
+ function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {
+ return vm.parseJsonIntArray(json, key);
+ }
+
+ function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {
+ return vm.parseJsonBytes32(json, key);
+ }
+
+ function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {
+ return vm.parseJsonBytes32Array(json, key);
+ }
+
+ function readString(string memory json, string memory key) internal pure returns (string memory) {
+ return vm.parseJsonString(json, key);
+ }
+
+ function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {
+ return vm.parseJsonStringArray(json, key);
+ }
+
+ function readAddress(string memory json, string memory key) internal pure returns (address) {
+ return vm.parseJsonAddress(json, key);
+ }
+
+ function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {
+ return vm.parseJsonAddressArray(json, key);
+ }
+
+ function readBool(string memory json, string memory key) internal pure returns (bool) {
+ return vm.parseJsonBool(json, key);
+ }
+
+ function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {
+ return vm.parseJsonBoolArray(json, key);
+ }
+
+ function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {
+ return vm.parseJsonBytes(json, key);
+ }
+
+ function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {
+ return vm.parseJsonBytesArray(json, key);
+ }
+
+ function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {
+ return keyExists(json, key) ? readUint(json, key) : defaultValue;
+ }
+
+ function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)
+ internal
+ view
+ returns (uint256[] memory)
+ {
+ return keyExists(json, key) ? readUintArray(json, key) : defaultValue;
+ }
+
+ function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {
+ return keyExists(json, key) ? readInt(json, key) : defaultValue;
+ }
+
+ function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)
+ internal
+ view
+ returns (int256[] memory)
+ {
+ return keyExists(json, key) ? readIntArray(json, key) : defaultValue;
+ }
+
+ function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)
+ internal
+ view
+ returns (bytes32)
+ {
+ return keyExists(json, key) ? readBytes32(json, key) : defaultValue;
+ }
+
+ function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)
+ internal
+ view
+ returns (bytes32[] memory)
+ {
+ return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;
+ }
+
+ function readStringOr(string memory json, string memory key, string memory defaultValue)
+ internal
+ view
+ returns (string memory)
+ {
+ return keyExists(json, key) ? readString(json, key) : defaultValue;
+ }
+
+ function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)
+ internal
+ view
+ returns (string[] memory)
+ {
+ return keyExists(json, key) ? readStringArray(json, key) : defaultValue;
+ }
+
+ function readAddressOr(string memory json, string memory key, address defaultValue)
+ internal
+ view
+ returns (address)
+ {
+ return keyExists(json, key) ? readAddress(json, key) : defaultValue;
+ }
+
+ function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)
+ internal
+ view
+ returns (address[] memory)
+ {
+ return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;
+ }
+
+ function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {
+ return keyExists(json, key) ? readBool(json, key) : defaultValue;
+ }
+
+ function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)
+ internal
+ view
+ returns (bool[] memory)
+ {
+ return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;
+ }
+
+ function readBytesOr(string memory json, string memory key, bytes memory defaultValue)
+ internal
+ view
+ returns (bytes memory)
+ {
+ return keyExists(json, key) ? readBytes(json, key) : defaultValue;
+ }
+
+ function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)
+ internal
+ view
+ returns (bytes[] memory)
+ {
+ return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;
+ }
+
+ function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {
+ return vm.serializeJson(jsonKey, rootObject);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function write(string memory jsonKey, string memory path) internal {
+ vm.writeJson(jsonKey, path);
+ }
+
+ function write(string memory jsonKey, string memory path, string memory valueKey) internal {
+ vm.writeJson(jsonKey, path, valueKey);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdMath.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdMath.sol
new file mode 100644
index 000000000..459523bda
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdMath.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+library stdMath {
+ int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;
+
+ function abs(int256 a) internal pure returns (uint256) {
+ // Required or it will fail when `a = type(int256).min`
+ if (a == INT256_MIN) {
+ return 57896044618658097711785492504343953926634992332820282019728792003956564819968;
+ }
+
+ return uint256(a > 0 ? a : -a);
+ }
+
+ function delta(uint256 a, uint256 b) internal pure returns (uint256) {
+ return a > b ? a - b : b - a;
+ }
+
+ function delta(int256 a, int256 b) internal pure returns (uint256) {
+ // a and b are of the same sign
+ // this works thanks to two's complement, the left-most bit is the sign bit
+ if ((a ^ b) > -1) {
+ return delta(abs(a), abs(b));
+ }
+
+ // a and b are of opposite signs
+ return abs(a) + abs(b);
+ }
+
+ function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {
+ uint256 absDelta = delta(a, b);
+
+ return absDelta * 1e18 / b;
+ }
+
+ function percentDelta(int256 a, int256 b) internal pure returns (uint256) {
+ uint256 absDelta = delta(a, b);
+ uint256 absB = abs(b);
+
+ return absDelta * 1e18 / absB;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdStorage.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdStorage.sol
new file mode 100644
index 000000000..1627af753
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdStorage.sol
@@ -0,0 +1,473 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {Vm} from "./Vm.sol";
+
+struct FindData {
+ uint256 slot;
+ uint256 offsetLeft;
+ uint256 offsetRight;
+ bool found;
+}
+
+struct StdStorage {
+ mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds;
+ bytes32[] _keys;
+ bytes4 _sig;
+ uint256 _depth;
+ address _target;
+ bytes32 _set;
+ bool _enable_packed_slots;
+ bytes _calldata;
+}
+
+library stdStorageSafe {
+ event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);
+ event WARNING_UninitedSlot(address who, uint256 slot);
+
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+ uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ function sigs(string memory sigStr) internal pure returns (bytes4) {
+ return bytes4(keccak256(bytes(sigStr)));
+ }
+
+ function getCallParams(StdStorage storage self) internal view returns (bytes memory) {
+ if (self._calldata.length == 0) {
+ return flatten(self._keys);
+ } else {
+ return self._calldata;
+ }
+ }
+
+ // Calls target contract with configured parameters
+ function callTarget(StdStorage storage self) internal view returns (bool, bytes32) {
+ bytes memory cd = abi.encodePacked(self._sig, getCallParams(self));
+ (bool success, bytes memory rdat) = self._target.staticcall(cd);
+ bytes32 result = bytesToBytes32(rdat, 32 * self._depth);
+
+ return (success, result);
+ }
+
+ // Tries mutating slot value to determine if the targeted value is stored in it.
+ // If current value is 0, then we are setting slot value to type(uint256).max
+ // Otherwise, we set it to 0. That way, return value should always be affected.
+ function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) {
+ bytes32 prevSlotValue = vm.load(self._target, slot);
+ (bool success, bytes32 prevReturnValue) = callTarget(self);
+
+ bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0);
+ vm.store(self._target, slot, testVal);
+
+ (, bytes32 newReturnValue) = callTarget(self);
+
+ vm.store(self._target, slot, prevSlotValue);
+
+ return (success && (prevReturnValue != newReturnValue));
+ }
+
+ // Tries setting one of the bits in slot to 1 until return value changes.
+ // Index of resulted bit is an offset packed slot has from left/right side
+ function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) {
+ for (uint256 offset = 0; offset < 256; offset++) {
+ uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset);
+ vm.store(self._target, slot, bytes32(valueToPut));
+
+ (bool success, bytes32 data) = callTarget(self);
+
+ if (success && (uint256(data) > 0)) {
+ return (true, offset);
+ }
+ }
+ return (false, 0);
+ }
+
+ function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) {
+ bytes32 prevSlotValue = vm.load(self._target, slot);
+
+ (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true);
+ (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false);
+
+ // `findOffset` may mutate slot value, so we are setting it to initial value
+ vm.store(self._target, slot, prevSlotValue);
+ return (foundLeft && foundRight, offsetLeft, offsetRight);
+ }
+
+ function find(StdStorage storage self) internal returns (FindData storage) {
+ return find(self, true);
+ }
+
+ /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against
+ // slot complexity:
+ // if flat, will be bytes32(uint256(uint));
+ // if map, will be keccak256(abi.encode(key, uint(slot)));
+ // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));
+ // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);
+ function find(StdStorage storage self, bool _clear) internal returns (FindData storage) {
+ address who = self._target;
+ bytes4 fsig = self._sig;
+ uint256 field_depth = self._depth;
+ bytes memory params = getCallParams(self);
+
+ // calldata to test against
+ if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {
+ if (_clear) {
+ clear(self);
+ }
+ return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ }
+ vm.record();
+ (, bytes32 callResult) = callTarget(self);
+ (bytes32[] memory reads,) = vm.accesses(address(who));
+
+ if (reads.length == 0) {
+ revert("stdStorage find(StdStorage): No storage use detected for target.");
+ } else {
+ for (uint256 i = reads.length; --i >= 0;) {
+ bytes32 prev = vm.load(who, reads[i]);
+ if (prev == bytes32(0)) {
+ emit WARNING_UninitedSlot(who, uint256(reads[i]));
+ }
+
+ if (!checkSlotMutatesCall(self, reads[i])) {
+ continue;
+ }
+
+ (uint256 offsetLeft, uint256 offsetRight) = (0, 0);
+
+ if (self._enable_packed_slots) {
+ bool found;
+ (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]);
+ if (!found) {
+ continue;
+ }
+ }
+
+ // Check that value between found offsets is equal to the current call result
+ uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight;
+
+ if (uint256(callResult) != curVal) {
+ continue;
+ }
+
+ emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i]));
+ self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] =
+ FindData(uint256(reads[i]), offsetLeft, offsetRight, true);
+ break;
+ }
+ }
+
+ require(
+ self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found,
+ "stdStorage find(StdStorage): Slot(s) not found."
+ );
+
+ if (_clear) {
+ clear(self);
+ }
+ return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ }
+
+ function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {
+ self._target = _target;
+ return self;
+ }
+
+ function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {
+ self._sig = _sig;
+ return self;
+ }
+
+ function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {
+ self._sig = sigs(_sig);
+ return self;
+ }
+
+ function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {
+ self._calldata = _calldata;
+ return self;
+ }
+
+ function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {
+ self._keys.push(bytes32(uint256(uint160(who))));
+ return self;
+ }
+
+ function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {
+ self._keys.push(bytes32(amt));
+ return self;
+ }
+
+ function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {
+ self._keys.push(key);
+ return self;
+ }
+
+ function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {
+ self._enable_packed_slots = true;
+ return self;
+ }
+
+ function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {
+ self._depth = _depth;
+ return self;
+ }
+
+ function read(StdStorage storage self) private returns (bytes memory) {
+ FindData storage data = find(self, false);
+ uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight);
+ uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight;
+ clear(self);
+ return abi.encode(value);
+ }
+
+ function read_bytes32(StdStorage storage self) internal returns (bytes32) {
+ return abi.decode(read(self), (bytes32));
+ }
+
+ function read_bool(StdStorage storage self) internal returns (bool) {
+ int256 v = read_int(self);
+ if (v == 0) return false;
+ if (v == 1) return true;
+ revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.");
+ }
+
+ function read_address(StdStorage storage self) internal returns (address) {
+ return abi.decode(read(self), (address));
+ }
+
+ function read_uint(StdStorage storage self) internal returns (uint256) {
+ return abi.decode(read(self), (uint256));
+ }
+
+ function read_int(StdStorage storage self) internal returns (int256) {
+ return abi.decode(read(self), (int256));
+ }
+
+ function parent(StdStorage storage self) internal returns (uint256, bytes32) {
+ address who = self._target;
+ uint256 field_depth = self._depth;
+ vm.startMappingRecording();
+ uint256 child = find(self, true).slot - field_depth;
+ (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));
+ if (!found) {
+ revert(
+ "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called."
+ );
+ }
+ return (uint256(parent_slot), key);
+ }
+
+ function root(StdStorage storage self) internal returns (uint256) {
+ address who = self._target;
+ uint256 field_depth = self._depth;
+ vm.startMappingRecording();
+ uint256 child = find(self, true).slot - field_depth;
+ bool found;
+ bytes32 root_slot;
+ bytes32 parent_slot;
+ (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));
+ if (!found) {
+ revert(
+ "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called."
+ );
+ }
+ while (found) {
+ root_slot = parent_slot;
+ (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot));
+ }
+ return uint256(root_slot);
+ }
+
+ function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {
+ bytes32 out;
+
+ uint256 max = b.length > 32 ? 32 : b.length;
+ for (uint256 i = 0; i < max; i++) {
+ out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);
+ }
+ return out;
+ }
+
+ function flatten(bytes32[] memory b) private pure returns (bytes memory) {
+ bytes memory result = new bytes(b.length * 32);
+ for (uint256 i = 0; i < b.length; i++) {
+ bytes32 k = b[i];
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(add(result, add(32, mul(32, i))), k)
+ }
+ }
+
+ return result;
+ }
+
+ function clear(StdStorage storage self) internal {
+ delete self._target;
+ delete self._sig;
+ delete self._keys;
+ delete self._depth;
+ delete self._enable_packed_slots;
+ delete self._calldata;
+ }
+
+ // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight`
+ // (slotValue & mask) >> offsetRight will be the value of the given packed variable
+ function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) {
+ // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight;
+ // using assembly because (1 << 256) causes overflow
+ assembly {
+ mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1))
+ }
+ }
+
+ // Returns slot value with updated packed variable.
+ function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight)
+ internal
+ pure
+ returns (bytes32 newValue)
+ {
+ return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight));
+ }
+}
+
+library stdStorage {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function sigs(string memory sigStr) internal pure returns (bytes4) {
+ return stdStorageSafe.sigs(sigStr);
+ }
+
+ function find(StdStorage storage self) internal returns (uint256) {
+ return find(self, true);
+ }
+
+ function find(StdStorage storage self, bool _clear) internal returns (uint256) {
+ return stdStorageSafe.find(self, _clear).slot;
+ }
+
+ function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {
+ return stdStorageSafe.target(self, _target);
+ }
+
+ function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {
+ return stdStorageSafe.sig(self, _sig);
+ }
+
+ function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {
+ return stdStorageSafe.sig(self, _sig);
+ }
+
+ function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, who);
+ }
+
+ function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, amt);
+ }
+
+ function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, key);
+ }
+
+ function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_calldata(self, _calldata);
+ }
+
+ function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {
+ return stdStorageSafe.enable_packed_slots(self);
+ }
+
+ function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {
+ return stdStorageSafe.depth(self, _depth);
+ }
+
+ function clear(StdStorage storage self) internal {
+ stdStorageSafe.clear(self);
+ }
+
+ function checked_write(StdStorage storage self, address who) internal {
+ checked_write(self, bytes32(uint256(uint160(who))));
+ }
+
+ function checked_write(StdStorage storage self, uint256 amt) internal {
+ checked_write(self, bytes32(amt));
+ }
+
+ function checked_write_int(StdStorage storage self, int256 val) internal {
+ checked_write(self, bytes32(uint256(val)));
+ }
+
+ function checked_write(StdStorage storage self, bool write) internal {
+ bytes32 t;
+ /// @solidity memory-safe-assembly
+ assembly {
+ t := write
+ }
+ checked_write(self, t);
+ }
+
+ function checked_write(StdStorage storage self, bytes32 set) internal {
+ address who = self._target;
+ bytes4 fsig = self._sig;
+ uint256 field_depth = self._depth;
+ bytes memory params = stdStorageSafe.getCallParams(self);
+
+ if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {
+ find(self, false);
+ }
+ FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ if ((data.offsetLeft + data.offsetRight) > 0) {
+ uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight));
+ require(
+ uint256(set) < maxVal,
+ string(
+ abi.encodePacked(
+ "stdStorage find(StdStorage): Packed slot. We can't fit value greater than ",
+ vm.toString(maxVal)
+ )
+ )
+ );
+ }
+ bytes32 curVal = vm.load(who, bytes32(data.slot));
+ bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight);
+
+ vm.store(who, bytes32(data.slot), valToSet);
+
+ (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self);
+
+ if (!success || callResult != set) {
+ vm.store(who, bytes32(data.slot), curVal);
+ revert("stdStorage find(StdStorage): Failed to write value.");
+ }
+ clear(self);
+ }
+
+ function read_bytes32(StdStorage storage self) internal returns (bytes32) {
+ return stdStorageSafe.read_bytes32(self);
+ }
+
+ function read_bool(StdStorage storage self) internal returns (bool) {
+ return stdStorageSafe.read_bool(self);
+ }
+
+ function read_address(StdStorage storage self) internal returns (address) {
+ return stdStorageSafe.read_address(self);
+ }
+
+ function read_uint(StdStorage storage self) internal returns (uint256) {
+ return stdStorageSafe.read_uint(self);
+ }
+
+ function read_int(StdStorage storage self) internal returns (int256) {
+ return stdStorageSafe.read_int(self);
+ }
+
+ function parent(StdStorage storage self) internal returns (uint256, bytes32) {
+ return stdStorageSafe.parent(self);
+ }
+
+ function root(StdStorage storage self) internal returns (uint256) {
+ return stdStorageSafe.root(self);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdStyle.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdStyle.sol
new file mode 100644
index 000000000..d371e0c60
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdStyle.sol
@@ -0,0 +1,333 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+import {VmSafe} from "./Vm.sol";
+
+library StdStyle {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ string constant RED = "\u001b[91m";
+ string constant GREEN = "\u001b[92m";
+ string constant YELLOW = "\u001b[93m";
+ string constant BLUE = "\u001b[94m";
+ string constant MAGENTA = "\u001b[95m";
+ string constant CYAN = "\u001b[96m";
+ string constant BOLD = "\u001b[1m";
+ string constant DIM = "\u001b[2m";
+ string constant ITALIC = "\u001b[3m";
+ string constant UNDERLINE = "\u001b[4m";
+ string constant INVERSE = "\u001b[7m";
+ string constant RESET = "\u001b[0m";
+
+ function styleConcat(string memory style, string memory self) private pure returns (string memory) {
+ return string(abi.encodePacked(style, self, RESET));
+ }
+
+ function red(string memory self) internal pure returns (string memory) {
+ return styleConcat(RED, self);
+ }
+
+ function red(uint256 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(int256 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(address self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(bool self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function redBytes(bytes memory self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function redBytes32(bytes32 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function green(string memory self) internal pure returns (string memory) {
+ return styleConcat(GREEN, self);
+ }
+
+ function green(uint256 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(int256 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(address self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(bool self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function greenBytes(bytes memory self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function greenBytes32(bytes32 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function yellow(string memory self) internal pure returns (string memory) {
+ return styleConcat(YELLOW, self);
+ }
+
+ function yellow(uint256 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(int256 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(address self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(bool self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellowBytes(bytes memory self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellowBytes32(bytes32 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function blue(string memory self) internal pure returns (string memory) {
+ return styleConcat(BLUE, self);
+ }
+
+ function blue(uint256 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(int256 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(address self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(bool self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blueBytes(bytes memory self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blueBytes32(bytes32 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function magenta(string memory self) internal pure returns (string memory) {
+ return styleConcat(MAGENTA, self);
+ }
+
+ function magenta(uint256 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(int256 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(address self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(bool self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magentaBytes(bytes memory self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magentaBytes32(bytes32 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function cyan(string memory self) internal pure returns (string memory) {
+ return styleConcat(CYAN, self);
+ }
+
+ function cyan(uint256 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(int256 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(address self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(bool self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyanBytes(bytes memory self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyanBytes32(bytes32 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function bold(string memory self) internal pure returns (string memory) {
+ return styleConcat(BOLD, self);
+ }
+
+ function bold(uint256 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(int256 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(address self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(bool self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function boldBytes(bytes memory self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function boldBytes32(bytes32 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function dim(string memory self) internal pure returns (string memory) {
+ return styleConcat(DIM, self);
+ }
+
+ function dim(uint256 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(int256 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(address self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(bool self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dimBytes(bytes memory self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dimBytes32(bytes32 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function italic(string memory self) internal pure returns (string memory) {
+ return styleConcat(ITALIC, self);
+ }
+
+ function italic(uint256 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(int256 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(address self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(bool self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italicBytes(bytes memory self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italicBytes32(bytes32 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function underline(string memory self) internal pure returns (string memory) {
+ return styleConcat(UNDERLINE, self);
+ }
+
+ function underline(uint256 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(int256 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(address self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(bool self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underlineBytes(bytes memory self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underlineBytes32(bytes32 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function inverse(string memory self) internal pure returns (string memory) {
+ return styleConcat(INVERSE, self);
+ }
+
+ function inverse(uint256 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(int256 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(address self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(bool self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverseBytes(bytes memory self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverseBytes32(bytes32 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdToml.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdToml.sol
new file mode 100644
index 000000000..7ad3be2f9
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdToml.sol
@@ -0,0 +1,283 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.0 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {VmSafe} from "./Vm.sol";
+
+// Helpers for parsing and writing TOML files
+// To parse:
+// ```
+// using stdToml for string;
+// string memory toml = vm.readFile("");
+// toml.readUint("");
+// ```
+// To write:
+// ```
+// using stdToml for string;
+// string memory json = "json";
+// json.serialize("a", uint256(123));
+// string memory semiFinal = json.serialize("b", string("test"));
+// string memory finalJson = json.serialize("c", semiFinal);
+// finalJson.write("");
+// ```
+
+library stdToml {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function keyExists(string memory toml, string memory key) internal view returns (bool) {
+ return vm.keyExistsToml(toml, key);
+ }
+
+ function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) {
+ return vm.parseToml(toml, key);
+ }
+
+ function readUint(string memory toml, string memory key) internal pure returns (uint256) {
+ return vm.parseTomlUint(toml, key);
+ }
+
+ function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) {
+ return vm.parseTomlUintArray(toml, key);
+ }
+
+ function readInt(string memory toml, string memory key) internal pure returns (int256) {
+ return vm.parseTomlInt(toml, key);
+ }
+
+ function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) {
+ return vm.parseTomlIntArray(toml, key);
+ }
+
+ function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) {
+ return vm.parseTomlBytes32(toml, key);
+ }
+
+ function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) {
+ return vm.parseTomlBytes32Array(toml, key);
+ }
+
+ function readString(string memory toml, string memory key) internal pure returns (string memory) {
+ return vm.parseTomlString(toml, key);
+ }
+
+ function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) {
+ return vm.parseTomlStringArray(toml, key);
+ }
+
+ function readAddress(string memory toml, string memory key) internal pure returns (address) {
+ return vm.parseTomlAddress(toml, key);
+ }
+
+ function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) {
+ return vm.parseTomlAddressArray(toml, key);
+ }
+
+ function readBool(string memory toml, string memory key) internal pure returns (bool) {
+ return vm.parseTomlBool(toml, key);
+ }
+
+ function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) {
+ return vm.parseTomlBoolArray(toml, key);
+ }
+
+ function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) {
+ return vm.parseTomlBytes(toml, key);
+ }
+
+ function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) {
+ return vm.parseTomlBytesArray(toml, key);
+ }
+
+ function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) {
+ return keyExists(toml, key) ? readUint(toml, key) : defaultValue;
+ }
+
+ function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue)
+ internal
+ view
+ returns (uint256[] memory)
+ {
+ return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue;
+ }
+
+ function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) {
+ return keyExists(toml, key) ? readInt(toml, key) : defaultValue;
+ }
+
+ function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue)
+ internal
+ view
+ returns (int256[] memory)
+ {
+ return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue;
+ }
+
+ function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue)
+ internal
+ view
+ returns (bytes32)
+ {
+ return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue;
+ }
+
+ function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue)
+ internal
+ view
+ returns (bytes32[] memory)
+ {
+ return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue;
+ }
+
+ function readStringOr(string memory toml, string memory key, string memory defaultValue)
+ internal
+ view
+ returns (string memory)
+ {
+ return keyExists(toml, key) ? readString(toml, key) : defaultValue;
+ }
+
+ function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue)
+ internal
+ view
+ returns (string[] memory)
+ {
+ return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue;
+ }
+
+ function readAddressOr(string memory toml, string memory key, address defaultValue)
+ internal
+ view
+ returns (address)
+ {
+ return keyExists(toml, key) ? readAddress(toml, key) : defaultValue;
+ }
+
+ function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue)
+ internal
+ view
+ returns (address[] memory)
+ {
+ return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue;
+ }
+
+ function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) {
+ return keyExists(toml, key) ? readBool(toml, key) : defaultValue;
+ }
+
+ function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue)
+ internal
+ view
+ returns (bool[] memory)
+ {
+ return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue;
+ }
+
+ function readBytesOr(string memory toml, string memory key, bytes memory defaultValue)
+ internal
+ view
+ returns (bytes memory)
+ {
+ return keyExists(toml, key) ? readBytes(toml, key) : defaultValue;
+ }
+
+ function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue)
+ internal
+ view
+ returns (bytes[] memory)
+ {
+ return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue;
+ }
+
+ function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {
+ return vm.serializeJson(jsonKey, rootObject);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function write(string memory jsonKey, string memory path) internal {
+ vm.writeToml(jsonKey, path);
+ }
+
+ function write(string memory jsonKey, string memory path, string memory valueKey) internal {
+ vm.writeToml(jsonKey, path, valueKey);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/StdUtils.sol b/lib/signals-implicit-mode/lib/forge-std/src/StdUtils.sol
new file mode 100644
index 000000000..9321df143
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/StdUtils.sol
@@ -0,0 +1,208 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {IMulticall3} from "./interfaces/IMulticall3.sol";
+import {VmSafe} from "./Vm.sol";
+
+abstract contract StdUtils {
+ /*//////////////////////////////////////////////////////////////////////////
+ CONSTANTS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+ address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
+ uint256 private constant INT256_MIN_ABS =
+ 57896044618658097711785492504343953926634992332820282019728792003956564819968;
+ uint256 private constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+ uint256 private constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.
+ address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+
+ /*//////////////////////////////////////////////////////////////////////////
+ INTERNAL FUNCTIONS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {
+ require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min.");
+ // If x is between min and max, return x directly. This is to ensure that dictionary values
+ // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188
+ if (x >= min && x <= max) return x;
+
+ uint256 size = max - min + 1;
+
+ // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.
+ // This helps ensure coverage of the min/max values.
+ if (x <= 3 && size > x) return min + x;
+ if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);
+
+ // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.
+ if (x > max) {
+ uint256 diff = x - max;
+ uint256 rem = diff % size;
+ if (rem == 0) return max;
+ result = min + rem - 1;
+ } else if (x < min) {
+ uint256 diff = min - x;
+ uint256 rem = diff % size;
+ if (rem == 0) return min;
+ result = max - rem + 1;
+ }
+ }
+
+ function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {
+ result = _bound(x, min, max);
+ console2_log_StdUtils("Bound result", result);
+ }
+
+ function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {
+ require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min.");
+
+ // Shifting all int256 values to uint256 to use _bound function. The range of two types are:
+ // int256 : -(2**255) ~ (2**255 - 1)
+ // uint256: 0 ~ (2**256 - 1)
+ // So, add 2**255, INT256_MIN_ABS to the integer values.
+ //
+ // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.
+ // So, use `~uint256(x) + 1` instead.
+ uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);
+ uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);
+ uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);
+
+ uint256 y = _bound(_x, _min, _max);
+
+ // To move it back to int256 value, subtract INT256_MIN_ABS at here.
+ result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);
+ }
+
+ function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {
+ result = _bound(x, min, max);
+ console2_log_StdUtils("Bound result", vm.toString(result));
+ }
+
+ function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) {
+ result = _bound(privateKey, 1, SECP256K1_ORDER - 1);
+ }
+
+ function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {
+ require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32.");
+ return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));
+ }
+
+ /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce
+ function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {
+ console2_log_StdUtils("computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead.");
+ return vm.computeCreateAddress(deployer, nonce);
+ }
+
+ function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)
+ internal
+ pure
+ virtual
+ returns (address)
+ {
+ console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.");
+ return vm.computeCreate2Address(salt, initcodeHash, deployer);
+ }
+
+ /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {
+ console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.");
+ return vm.computeCreate2Address(salt, initCodeHash);
+ }
+
+ /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments
+ /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode
+ function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {
+ return hashInitCode(creationCode, "");
+ }
+
+ /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2
+ /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode
+ /// @param args the ABI-encoded arguments to the constructor of C
+ function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {
+ return keccak256(abi.encodePacked(creationCode, args));
+ }
+
+ // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.
+ function getTokenBalances(address token, address[] memory addresses)
+ internal
+ virtual
+ returns (uint256[] memory balances)
+ {
+ uint256 tokenCodeSize;
+ assembly {
+ tokenCodeSize := extcodesize(token)
+ }
+ require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract.");
+
+ // ABI encode the aggregate call to Multicall3.
+ uint256 length = addresses.length;
+ IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ // 0x70a08231 = bytes4("balanceOf(address)"))
+ calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});
+ }
+
+ // Make the aggregate call.
+ (, bytes[] memory returnData) = multicall.aggregate(calls);
+
+ // ABI decode the return data and return the balances.
+ balances = new uint256[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ balances[i] = abi.decode(returnData[i], (uint256));
+ }
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ PRIVATE FUNCTIONS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {
+ return address(uint160(uint256(bytesValue)));
+ }
+
+ // This section is used to prevent the compilation of console, which shortens the compilation time when console is
+ // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid
+ // any breaking changes to function signatures.
+ function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn)
+ internal
+ pure
+ returns (function(bytes memory) internal pure fnOut)
+ {
+ assembly {
+ fnOut := fnIn
+ }
+ }
+
+ function _sendLogPayload(bytes memory payload) internal pure {
+ _castLogPayloadViewToPure(_sendLogPayloadView)(payload);
+ }
+
+ function _sendLogPayloadView(bytes memory payload) private view {
+ uint256 payloadLength = payload.length;
+ address consoleAddress = CONSOLE2_ADDRESS;
+ /// @solidity memory-safe-assembly
+ assembly {
+ let payloadStart := add(payload, 32)
+ let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
+ }
+ }
+
+ function console2_log_StdUtils(string memory p0) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function console2_log_StdUtils(string memory p0, uint256 p1) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
+ }
+
+ function console2_log_StdUtils(string memory p0, string memory p1) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/Test.sol b/lib/signals-implicit-mode/lib/forge-std/src/Test.sol
new file mode 100644
index 000000000..11b18f29f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/Test.sol
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+// 💬 ABOUT
+// Forge Std's default Test.
+
+// 🧩 MODULES
+import {console} from "./console.sol";
+import {console2} from "./console2.sol";
+import {safeconsole} from "./safeconsole.sol";
+import {StdAssertions} from "./StdAssertions.sol";
+import {StdChains} from "./StdChains.sol";
+import {StdCheats} from "./StdCheats.sol";
+import {StdConstants} from "./StdConstants.sol";
+import {stdError} from "./StdError.sol";
+import {StdInvariant} from "./StdInvariant.sol";
+import {stdJson} from "./StdJson.sol";
+import {stdMath} from "./StdMath.sol";
+import {StdStorage, stdStorage} from "./StdStorage.sol";
+import {StdStyle} from "./StdStyle.sol";
+import {stdToml} from "./StdToml.sol";
+import {StdUtils} from "./StdUtils.sol";
+import {Vm} from "./Vm.sol";
+
+// 📦 BOILERPLATE
+import {TestBase} from "./Base.sol";
+
+// ⭐️ TEST
+abstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils {
+ // Note: IS_TEST() must return true.
+ bool public IS_TEST = true;
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/Vm.sol b/lib/signals-implicit-mode/lib/forge-std/src/Vm.sol
new file mode 100644
index 000000000..cd883706a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/Vm.sol
@@ -0,0 +1,2494 @@
+// Automatically @generated by scripts/vm.py. Do not modify manually.
+
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.6.2 <0.9.0;
+pragma experimental ABIEncoderV2;
+
+/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may
+/// result in Script simulations differing from on-chain execution. It is recommended to only use
+/// these cheats in scripts.
+interface VmSafe {
+ /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.
+ enum CallerMode {
+ // No caller modification is currently active.
+ None,
+ // A one time broadcast triggered by a `vm.broadcast()` call is currently active.
+ Broadcast,
+ // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.
+ RecurrentBroadcast,
+ // A one time prank triggered by a `vm.prank()` call is currently active.
+ Prank,
+ // A recurrent prank triggered by a `vm.startPrank()` call is currently active.
+ RecurrentPrank
+ }
+
+ /// The kind of account access that occurred.
+ enum AccountAccessKind {
+ // The account was called.
+ Call,
+ // The account was called via delegatecall.
+ DelegateCall,
+ // The account was called via callcode.
+ CallCode,
+ // The account was called via staticcall.
+ StaticCall,
+ // The account was created.
+ Create,
+ // The account was selfdestructed.
+ SelfDestruct,
+ // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).
+ Resume,
+ // The account's balance was read.
+ Balance,
+ // The account's codesize was read.
+ Extcodesize,
+ // The account's codehash was read.
+ Extcodehash,
+ // The account's code was copied.
+ Extcodecopy
+ }
+
+ /// Forge execution contexts.
+ enum ForgeContext {
+ // Test group execution context (test, coverage or snapshot).
+ TestGroup,
+ // `forge test` execution context.
+ Test,
+ // `forge coverage` execution context.
+ Coverage,
+ // `forge snapshot` execution context.
+ Snapshot,
+ // Script group execution context (dry run, broadcast or resume).
+ ScriptGroup,
+ // `forge script` execution context.
+ ScriptDryRun,
+ // `forge script --broadcast` execution context.
+ ScriptBroadcast,
+ // `forge script --resume` execution context.
+ ScriptResume,
+ // Unknown `forge` execution context.
+ Unknown
+ }
+
+ /// The transaction type (`txType`) of the broadcast.
+ enum BroadcastTxType {
+ // Represents a CALL broadcast tx.
+ Call,
+ // Represents a CREATE broadcast tx.
+ Create,
+ // Represents a CREATE2 broadcast tx.
+ Create2
+ }
+
+ /// An Ethereum log. Returned by `getRecordedLogs`.
+ struct Log {
+ // The topics of the log, including the signature, if any.
+ bytes32[] topics;
+ // The raw data of the log.
+ bytes data;
+ // The address of the log's emitter.
+ address emitter;
+ }
+
+ /// An RPC URL and its alias. Returned by `rpcUrlStructs`.
+ struct Rpc {
+ // The alias of the RPC URL.
+ string key;
+ // The RPC URL.
+ string url;
+ }
+
+ /// An RPC log object. Returned by `eth_getLogs`.
+ struct EthGetLogs {
+ // The address of the log's emitter.
+ address emitter;
+ // The topics of the log, including the signature, if any.
+ bytes32[] topics;
+ // The raw data of the log.
+ bytes data;
+ // The block hash.
+ bytes32 blockHash;
+ // The block number.
+ uint64 blockNumber;
+ // The transaction hash.
+ bytes32 transactionHash;
+ // The transaction index in the block.
+ uint64 transactionIndex;
+ // The log index.
+ uint256 logIndex;
+ // Whether the log was removed.
+ bool removed;
+ }
+
+ /// A single entry in a directory listing. Returned by `readDir`.
+ struct DirEntry {
+ // The error message, if any.
+ string errorMessage;
+ // The path of the entry.
+ string path;
+ // The depth of the entry.
+ uint64 depth;
+ // Whether the entry is a directory.
+ bool isDir;
+ // Whether the entry is a symlink.
+ bool isSymlink;
+ }
+
+ /// Metadata information about a file.
+ /// This structure is returned from the `fsMetadata` function and represents known
+ /// metadata about a file such as its permissions, size, modification
+ /// times, etc.
+ struct FsMetadata {
+ // True if this metadata is for a directory.
+ bool isDir;
+ // True if this metadata is for a symlink.
+ bool isSymlink;
+ // The size of the file, in bytes, this metadata is for.
+ uint256 length;
+ // True if this metadata is for a readonly (unwritable) file.
+ bool readOnly;
+ // The last modification time listed in this metadata.
+ uint256 modified;
+ // The last access time of this metadata.
+ uint256 accessed;
+ // The creation time listed in this metadata.
+ uint256 created;
+ }
+
+ /// A wallet with a public and private key.
+ struct Wallet {
+ // The wallet's address.
+ address addr;
+ // The wallet's public key `X`.
+ uint256 publicKeyX;
+ // The wallet's public key `Y`.
+ uint256 publicKeyY;
+ // The wallet's private key.
+ uint256 privateKey;
+ }
+
+ /// The result of a `tryFfi` call.
+ struct FfiResult {
+ // The exit code of the call.
+ int32 exitCode;
+ // The optionally hex-decoded `stdout` data.
+ bytes stdout;
+ // The `stderr` data.
+ bytes stderr;
+ }
+
+ /// Information on the chain and fork.
+ struct ChainInfo {
+ // The fork identifier. Set to zero if no fork is active.
+ uint256 forkId;
+ // The chain ID of the current fork.
+ uint256 chainId;
+ }
+
+ /// Information about a blockchain.
+ struct Chain {
+ // The chain name.
+ string name;
+ // The chain's Chain ID.
+ uint256 chainId;
+ // The chain's alias. (i.e. what gets specified in `foundry.toml`).
+ string chainAlias;
+ // A default RPC endpoint for this chain.
+ string rpcUrl;
+ }
+
+ /// The result of a `stopAndReturnStateDiff` call.
+ struct AccountAccess {
+ // The chain and fork the access occurred.
+ ChainInfo chainInfo;
+ // The kind of account access that determines what the account is.
+ // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.
+ // If kind is Create, then the account is the newly created account.
+ // If kind is SelfDestruct, then the account is the selfdestruct recipient.
+ // If kind is a Resume, then account represents a account context that has resumed.
+ AccountAccessKind kind;
+ // The account that was accessed.
+ // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.
+ address account;
+ // What accessed the account.
+ address accessor;
+ // If the account was initialized or empty prior to the access.
+ // An account is considered initialized if it has code, a
+ // non-zero nonce, or a non-zero balance.
+ bool initialized;
+ // The previous balance of the accessed account.
+ uint256 oldBalance;
+ // The potential new balance of the accessed account.
+ // That is, all balance changes are recorded here, even if reverts occurred.
+ uint256 newBalance;
+ // Code of the account deployed by CREATE.
+ bytes deployedCode;
+ // Value passed along with the account access
+ uint256 value;
+ // Input data provided to the CREATE or CALL
+ bytes data;
+ // If this access reverted in either the current or parent context.
+ bool reverted;
+ // An ordered list of storage accesses made during an account access operation.
+ StorageAccess[] storageAccesses;
+ // Call depth traversed during the recording of state differences
+ uint64 depth;
+ // The previous nonce of the accessed account.
+ uint64 oldNonce;
+ // The new nonce of the accessed account.
+ uint64 newNonce;
+ }
+
+ /// The storage accessed during an `AccountAccess`.
+ struct StorageAccess {
+ // The account whose storage was accessed.
+ address account;
+ // The slot that was accessed.
+ bytes32 slot;
+ // If the access was a write.
+ bool isWrite;
+ // The previous value of the slot.
+ bytes32 previousValue;
+ // The new value of the slot.
+ bytes32 newValue;
+ // If the access was reverted.
+ bool reverted;
+ }
+
+ /// Gas used. Returned by `lastCallGas`.
+ struct Gas {
+ // The gas limit of the call.
+ uint64 gasLimit;
+ // The total gas used.
+ uint64 gasTotalUsed;
+ // DEPRECATED: The amount of gas used for memory expansion. Ref:
+ uint64 gasMemoryUsed;
+ // The amount of gas refunded.
+ int64 gasRefunded;
+ // The amount of gas remaining.
+ uint64 gasRemaining;
+ }
+
+ /// The result of the `stopDebugTraceRecording` call
+ struct DebugStep {
+ // The stack before executing the step of the run.
+ // stack\[0\] represents the top of the stack.
+ // and only stack data relevant to the opcode execution is contained.
+ uint256[] stack;
+ // The memory input data before executing the step of the run.
+ // only input data relevant to the opcode execution is contained.
+ // e.g. for MLOAD, it will have memory\[offset:offset+32\] copied here.
+ // the offset value can be get by the stack data.
+ bytes memoryInput;
+ // The opcode that was accessed.
+ uint8 opcode;
+ // The call depth of the step.
+ uint64 depth;
+ // Whether the call end up with out of gas error.
+ bool isOutOfGas;
+ // The contract address where the opcode is running
+ address contractAddr;
+ }
+
+ /// Represents a transaction's broadcast details.
+ struct BroadcastTxSummary {
+ // The hash of the transaction that was broadcasted
+ bytes32 txHash;
+ // Represent the type of transaction among CALL, CREATE, CREATE2
+ BroadcastTxType txType;
+ // The address of the contract that was called or created.
+ // This is address of the contract that is created if the txType is CREATE or CREATE2.
+ address contractAddress;
+ // The block number the transaction landed in.
+ uint64 blockNumber;
+ // Status of the transaction, retrieved from the transaction receipt.
+ bool success;
+ }
+
+ /// Holds a signed EIP-7702 authorization for an authority account to delegate to an implementation.
+ struct SignedDelegation {
+ // The y-parity of the recovered secp256k1 signature (0 or 1).
+ uint8 v;
+ // First 32 bytes of the signature.
+ bytes32 r;
+ // Second 32 bytes of the signature.
+ bytes32 s;
+ // The current nonce of the authority account at signing time.
+ // Used to ensure signature can't be replayed after account nonce changes.
+ uint64 nonce;
+ // Address of the contract implementation that will be delegated to.
+ // Gets encoded into delegation code: 0xef0100 || implementation.
+ address implementation;
+ }
+
+ /// Represents a "potential" revert reason from a single subsequent call when using `vm.assumeNoReverts`.
+ /// Reverts that match will result in a FOUNDRY::ASSUME rejection, whereas unmatched reverts will be surfaced
+ /// as normal.
+ struct PotentialRevert {
+ // The allowed origin of the revert opcode; address(0) allows reverts from any address
+ address reverter;
+ // When true, only matches on the beginning of the revert data, otherwise, matches on entire revert data
+ bool partialMatch;
+ // The data to use to match encountered reverts
+ bytes revertData;
+ }
+
+ /// An EIP-2930 access list item.
+ struct AccessListItem {
+ // The address to be added in access list.
+ address target;
+ // The storage keys to be added in access list.
+ bytes32[] storageKeys;
+ }
+
+ // ======== Crypto ========
+
+ /// Derives a private key from the name, labels the account with that name, and returns the wallet.
+ function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);
+
+ /// Generates a wallet from the private key and returns the wallet.
+ function createWallet(uint256 privateKey) external returns (Wallet memory wallet);
+
+ /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.
+ function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);
+
+ /// Derive a private key from a provided mnemonic string (or mnemonic file path)
+ /// at the derivation path `m/44'/60'/0'/0/{index}`.
+ function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnemonic string (or mnemonic file path)
+ /// at `{derivationPath}{index}`.
+ function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnemonic string (or mnemonic file path) in the specified language
+ /// at the derivation path `m/44'/60'/0'/0/{index}`.
+ function deriveKey(string calldata mnemonic, uint32 index, string calldata language)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnemonic string (or mnemonic file path) in the specified language
+ /// at `{derivationPath}{index}`.
+ function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derives secp256r1 public key from the provided `privateKey`.
+ function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);
+
+ /// Adds a private key to the local forge wallet and returns the address.
+ function rememberKey(uint256 privateKey) external returns (address keyAddr);
+
+ /// Derive a set number of wallets from a mnemonic at the derivation path `m/44'/60'/0'/0/{0..count}`.
+ /// The respective private keys are saved to the local forge wallet for later use and their addresses are returned.
+ function rememberKeys(string calldata mnemonic, string calldata derivationPath, uint32 count)
+ external
+ returns (address[] memory keyAddrs);
+
+ /// Derive a set number of wallets from a mnemonic in the specified language at the derivation path `m/44'/60'/0'/0/{0..count}`.
+ /// The respective private keys are saved to the local forge wallet for later use and their addresses are returned.
+ function rememberKeys(
+ string calldata mnemonic,
+ string calldata derivationPath,
+ string calldata language,
+ uint32 count
+ ) external returns (address[] memory keyAddrs);
+
+ /// Signs data with a `Wallet`.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with `privateKey` using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ /// If `--sender` is provided, the signer with provided address is used, otherwise,
+ /// if exactly one signer is provided to the script, that signer is used.
+ /// Raises error if signer passed through `--sender` does not match any unlocked signers or
+ /// if `--sender` is not provided and not exactly one signer is passed to the script.
+ function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ /// Raises error if none of the signers passed into the script have provided address.
+ function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with `privateKey` using the secp256r1 curve.
+ function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);
+
+ /// Signs data with a `Wallet`.
+ function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with `privateKey` using the secp256k1 curve.
+ function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// If `--sender` is provided, the signer with provided address is used, otherwise,
+ /// if exactly one signer is provided to the script, that signer is used.
+ /// Raises error if signer passed through `--sender` does not match any unlocked signers or
+ /// if `--sender` is not provided and not exactly one signer is passed to the script.
+ function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Raises error if none of the signers passed into the script have provided address.
+ function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ // ======== Environment ========
+
+ /// Gets the environment variable `name` and parses it as `address`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envAddress(string calldata name) external view returns (address value);
+
+ /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bool`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBool(string calldata name) external view returns (bool value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes32`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes32(string calldata name) external view returns (bytes32 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes(string calldata name) external view returns (bytes memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);
+
+ /// Gets the environment variable `name` and returns true if it exists, else returns false.
+ function envExists(string calldata name) external view returns (bool result);
+
+ /// Gets the environment variable `name` and parses it as `int256`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envInt(string calldata name) external view returns (int256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bool`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bool defaultValue) external view returns (bool value);
+
+ /// Gets the environment variable `name` and parses it as `uint256`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)
+ external
+ view
+ returns (address[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)
+ external
+ view
+ returns (bytes32[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)
+ external
+ view
+ returns (string[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)
+ external
+ view
+ returns (bytes[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `int256`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);
+
+ /// Gets the environment variable `name` and parses it as `address`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, address defaultValue) external view returns (address value);
+
+ /// Gets the environment variable `name` and parses it as `bytes32`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);
+
+ /// Gets the environment variable `name` and parses it as `string`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)
+ external
+ view
+ returns (bool[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)
+ external
+ view
+ returns (uint256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)
+ external
+ view
+ returns (int256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `string`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envString(string calldata name) external view returns (string memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envString(string calldata name, string calldata delim) external view returns (string[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `uint256`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envUint(string calldata name) external view returns (uint256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);
+
+ /// Returns true if `forge` command was executed in given context.
+ function isContext(ForgeContext context) external view returns (bool result);
+
+ /// Resolves the env variable placeholders of a given input string.
+ function resolveEnv(string calldata input) external returns (string memory);
+
+ /// Sets environment variables.
+ function setEnv(string calldata name, string calldata value) external;
+
+ // ======== EVM ========
+
+ /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.
+ function accesses(address target) external view returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);
+
+ /// Gets the address for a given private key.
+ function addr(uint256 privateKey) external pure returns (address keyAddr);
+
+ /// Gets all the logs according to specified filter.
+ function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)
+ external
+ view
+ returns (EthGetLogs[] memory logs);
+
+ /// Gets the current `block.blobbasefee`.
+ /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlobBaseFee() external view returns (uint256 blobBaseFee);
+
+ /// Gets the current `block.number`.
+ /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlockNumber() external view returns (uint256 height);
+
+ /// Gets the current `block.timestamp`.
+ /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlockTimestamp() external view returns (uint256 timestamp);
+
+ /// Gets the current `block.chainid` of the currently selected environment.
+ /// You should use this instead of `block.chainid` if you use `vm.selectFork` or `vm.createSelectFork`, as `block.chainid` could be assumed
+ /// to be constant across a transaction, and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getChainId() external view returns (uint256 blockChainId);
+
+ /// Gets the map key and parent of a mapping at a given slot, for a given address.
+ function getMappingKeyAndParentOf(address target, bytes32 elementSlot)
+ external
+ view
+ returns (bool found, bytes32 key, bytes32 parent);
+
+ /// Gets the number of elements in the mapping at the given slot, for a given address.
+ function getMappingLength(address target, bytes32 mappingSlot) external view returns (uint256 length);
+
+ /// Gets the elements at index idx of the mapping at the given slot, for a given address. The
+ /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).
+ function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external view returns (bytes32 value);
+
+ /// Gets the nonce of an account.
+ function getNonce(address account) external view returns (uint64 nonce);
+
+ /// Get the nonce of a `Wallet`.
+ function getNonce(Wallet calldata wallet) external view returns (uint64 nonce);
+
+ /// Gets the RLP encoded block header for a given block number.
+ /// Returns the block header in the same format as `cast block --raw`.
+ function getRawBlockHeader(uint256 blockNumber) external view returns (bytes memory rlpHeader);
+
+ /// Gets all the recorded logs.
+ function getRecordedLogs() external view returns (Log[] memory logs);
+
+ /// Returns state diffs from current `vm.startStateDiffRecording` session.
+ function getStateDiff() external view returns (string memory diff);
+
+ /// Returns state diffs from current `vm.startStateDiffRecording` session, in json format.
+ function getStateDiffJson() external view returns (string memory diff);
+
+ /// Returns an array of `StorageAccess` from current `vm.stateStateDiffRecording` session
+ function getStorageAccesses() external view returns (StorageAccess[] memory storageAccesses);
+
+ /// Gets the gas used in the last call from the callee perspective.
+ function lastCallGas() external view returns (Gas memory gas);
+
+ /// Loads a storage slot from an address.
+ function load(address target, bytes32 slot) external view returns (bytes32 data);
+
+ /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.
+ function pauseGasMetering() external;
+
+ /// Records all storage reads and writes. Use `accesses` to get the recorded data.
+ /// Subsequent calls to `record` will clear the previous data.
+ function record() external;
+
+ /// Record all the transaction logs.
+ function recordLogs() external;
+
+ /// Reset gas metering (i.e. gas usage is set to gas limit).
+ function resetGasMetering() external;
+
+ /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.
+ function resumeGasMetering() external;
+
+ /// Performs an Ethereum JSON-RPC request to the current fork URL.
+ function rpc(string calldata method, string calldata params) external returns (bytes memory data);
+
+ /// Performs an Ethereum JSON-RPC request to the given endpoint.
+ function rpc(string calldata urlOrAlias, string calldata method, string calldata params)
+ external
+ returns (bytes memory data);
+
+ /// Records the debug trace during the run.
+ function startDebugTraceRecording() external;
+
+ /// Starts recording all map SSTOREs for later retrieval.
+ function startMappingRecording() external;
+
+ /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,
+ /// along with the context of the calls
+ function startStateDiffRecording() external;
+
+ /// Stop debug trace recording and returns the recorded debug trace.
+ function stopAndReturnDebugTraceRecording() external returns (DebugStep[] memory step);
+
+ /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.
+ function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);
+
+ /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.
+ function stopMappingRecording() external;
+
+ /// Stops recording storage reads and writes.
+ function stopRecord() external;
+
+ // ======== Filesystem ========
+
+ /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.
+ /// `path` is relative to the project root.
+ function closeFile(string calldata path) external;
+
+ /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.
+ /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.
+ /// Both `from` and `to` are relative to the project root.
+ function copyFile(string calldata from, string calldata to) external returns (uint64 copied);
+
+ /// Creates a new, empty directory at the provided path.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - User lacks permissions to modify `path`.
+ /// - A parent of the given path doesn't exist and `recursive` is false.
+ /// - `path` already exists and `recursive` is false.
+ /// `path` is relative to the project root.
+ function createDir(string calldata path, bool recursive) external;
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function deployCode(string calldata artifactPath) external returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Additionally accepts abi-encoded constructor arguments.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs)
+ external
+ returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Additionally accepts `msg.value`.
+ function deployCode(string calldata artifactPath, uint256 value) external returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Additionally accepts abi-encoded constructor arguments and `msg.value`.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs, uint256 value)
+ external
+ returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function deployCode(string calldata artifactPath, bytes32 salt) external returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Additionally accepts abi-encoded constructor arguments.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs, bytes32 salt)
+ external
+ returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Additionally accepts `msg.value`.
+ function deployCode(string calldata artifactPath, uint256 value, bytes32 salt)
+ external
+ returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Additionally accepts abi-encoded constructor arguments and `msg.value`.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs, uint256 value, bytes32 salt)
+ external
+ returns (address deployedAddress);
+
+ /// Returns true if the given path points to an existing entity, else returns false.
+ function exists(string calldata path) external view returns (bool result);
+
+ /// Performs a foreign function call via the terminal.
+ function ffi(string[] calldata commandInput) external returns (bytes memory result);
+
+ /// Given a path, query the file system to get information about a file, directory, etc.
+ function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);
+
+ /// Gets the artifact path from code (aka. creation code).
+ function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);
+
+ /// Gets the artifact path from deployed code (aka. runtime code).
+ function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);
+
+ /// Returns the most recent broadcast for the given contract on `chainId` matching `txType`.
+ /// For example:
+ /// The most recent deployment can be fetched by passing `txType` as `CREATE` or `CREATE2`.
+ /// The most recent call can be fetched by passing `txType` as `CALL`.
+ function getBroadcast(string calldata contractName, uint64 chainId, BroadcastTxType txType)
+ external
+ view
+ returns (BroadcastTxSummary memory);
+
+ /// Returns all broadcasts for the given contract on `chainId` with the specified `txType`.
+ /// Sorted such that the most recent broadcast is the first element, and the oldest is the last. i.e descending order of BroadcastTxSummary.blockNumber.
+ function getBroadcasts(string calldata contractName, uint64 chainId, BroadcastTxType txType)
+ external
+ view
+ returns (BroadcastTxSummary[] memory);
+
+ /// Returns all broadcasts for the given contract on `chainId`.
+ /// Sorted such that the most recent broadcast is the first element, and the oldest is the last. i.e descending order of BroadcastTxSummary.blockNumber.
+ function getBroadcasts(string calldata contractName, uint64 chainId)
+ external
+ view
+ returns (BroadcastTxSummary[] memory);
+
+ /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);
+
+ /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);
+
+ /// Returns the most recent deployment for the current `chainId`.
+ function getDeployment(string calldata contractName) external view returns (address deployedAddress);
+
+ /// Returns the most recent deployment for the given contract on `chainId`
+ function getDeployment(string calldata contractName, uint64 chainId)
+ external
+ view
+ returns (address deployedAddress);
+
+ /// Returns all deployments for the given contract on `chainId`
+ /// Sorted in descending order of deployment time i.e descending order of BroadcastTxSummary.blockNumber.
+ /// The most recent deployment is the first element, and the oldest is the last.
+ function getDeployments(string calldata contractName, uint64 chainId)
+ external
+ view
+ returns (address[] memory deployedAddresses);
+
+ /// Returns true if the path exists on disk and is pointing at a directory, else returns false.
+ function isDir(string calldata path) external view returns (bool result);
+
+ /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.
+ function isFile(string calldata path) external view returns (bool result);
+
+ /// Get the path of the current project root.
+ function projectRoot() external view returns (string memory path);
+
+ /// Prompts the user for a string value in the terminal.
+ function prompt(string calldata promptText) external returns (string memory input);
+
+ /// Prompts the user for an address in the terminal.
+ function promptAddress(string calldata promptText) external returns (address);
+
+ /// Prompts the user for a hidden string value in the terminal.
+ function promptSecret(string calldata promptText) external returns (string memory input);
+
+ /// Prompts the user for hidden uint256 in the terminal (usually pk).
+ function promptSecretUint(string calldata promptText) external returns (uint256);
+
+ /// Prompts the user for uint256 in the terminal.
+ function promptUint(string calldata promptText) external returns (uint256);
+
+ /// Reads the directory at the given path recursively, up to `maxDepth`.
+ /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.
+ /// Follows symbolic links if `followLinks` is true.
+ function readDir(string calldata path) external view returns (DirEntry[] memory entries);
+
+ /// See `readDir(string)`.
+ function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);
+
+ /// See `readDir(string)`.
+ function readDir(string calldata path, uint64 maxDepth, bool followLinks)
+ external
+ view
+ returns (DirEntry[] memory entries);
+
+ /// Reads the entire content of file to string. `path` is relative to the project root.
+ function readFile(string calldata path) external view returns (string memory data);
+
+ /// Reads the entire content of file as binary. `path` is relative to the project root.
+ function readFileBinary(string calldata path) external view returns (bytes memory data);
+
+ /// Reads next line of file to string.
+ function readLine(string calldata path) external view returns (string memory line);
+
+ /// Reads a symbolic link, returning the path that the link points to.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` is not a symbolic link.
+ /// - `path` does not exist.
+ function readLink(string calldata linkPath) external view returns (string memory targetPath);
+
+ /// Removes a directory at the provided path.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` doesn't exist.
+ /// - `path` isn't a directory.
+ /// - User lacks permissions to modify `path`.
+ /// - The directory is not empty and `recursive` is false.
+ /// `path` is relative to the project root.
+ function removeDir(string calldata path, bool recursive) external;
+
+ /// Removes a file from the filesystem.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` points to a directory.
+ /// - The file doesn't exist.
+ /// - The user lacks permissions to remove the file.
+ /// `path` is relative to the project root.
+ function removeFile(string calldata path) external;
+
+ /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.
+ function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);
+
+ /// Returns the time since unix epoch in milliseconds.
+ function unixTime() external view returns (uint256 milliseconds);
+
+ /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.
+ /// `path` is relative to the project root.
+ function writeFile(string calldata path, string calldata data) external;
+
+ /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.
+ /// `path` is relative to the project root.
+ function writeFileBinary(string calldata path, bytes calldata data) external;
+
+ /// Writes line to file, creating a file if it does not exist.
+ /// `path` is relative to the project root.
+ function writeLine(string calldata path, string calldata data) external;
+
+ // ======== JSON ========
+
+ /// Checks if `key` exists in a JSON object.
+ function keyExistsJson(string calldata json, string calldata key) external view returns (bool);
+
+ /// Parses a string of JSON data at `key` and coerces it to `address`.
+ function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);
+
+ /// Parses a string of JSON data at `key` and coerces it to `address[]`.
+ function parseJsonAddressArray(string calldata json, string calldata key)
+ external
+ pure
+ returns (address[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bool`.
+ function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bool[]`.
+ function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes`.
+ function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes32`.
+ function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.
+ function parseJsonBytes32Array(string calldata json, string calldata key)
+ external
+ pure
+ returns (bytes32[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.
+ function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `int256`.
+ function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);
+
+ /// Parses a string of JSON data at `key` and coerces it to `int256[]`.
+ function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);
+
+ /// Returns an array of all the keys in a JSON object.
+ function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);
+
+ /// Parses a string of JSON data at `key` and coerces it to `string`.
+ function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `string[]`.
+ function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.
+ function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.
+ function parseJsonType(string calldata json, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.
+ function parseJsonType(string calldata json, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `uint256`.
+ function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);
+
+ /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.
+ function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);
+
+ /// ABI-encodes a JSON object.
+ function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);
+
+ /// ABI-encodes a JSON object at `key`.
+ function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);
+
+ /// See `serializeJson`.
+ function serializeAddress(string calldata objectKey, string calldata valueKey, address value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBool(string calldata objectKey, string calldata valueKey, bool value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)
+ external
+ returns (string memory json);
+
+ /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.
+ /// Returns the stringified version of the specific JSON file up to that moment.
+ function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeJsonType(string calldata typeDescription, bytes calldata value)
+ external
+ pure
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeJsonType(
+ string calldata objectKey,
+ string calldata valueKey,
+ string calldata typeDescription,
+ bytes calldata value
+ ) external returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)
+ external
+ returns (string memory json);
+
+ /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.
+ function writeJson(string calldata json, string calldata path) external;
+
+ /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key =
+ /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.
+ /// This cheatcode will create new keys if they didn't previously exist.
+ function writeJson(string calldata json, string calldata path, string calldata valueKey) external;
+
+ /// Checks if `key` exists in a JSON object
+ /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.
+ function keyExists(string calldata json, string calldata key) external view returns (bool);
+
+ // ======== Scripting ========
+
+ /// Attach an EIP-4844 blob to the next call
+ function attachBlob(bytes calldata blob) external;
+
+ /// Designate the next call as an EIP-7702 transaction
+ function attachDelegation(SignedDelegation calldata signedDelegation) external;
+
+ /// Designate the next call as an EIP-7702 transaction, with optional cross-chain validity.
+ function attachDelegation(SignedDelegation calldata signedDelegation, bool crossChain) external;
+
+ /// Takes a signed transaction and broadcasts it to the network.
+ function broadcastRawTransaction(bytes calldata data) external;
+
+ /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.
+ /// Broadcasting address is determined by checking the following in order:
+ /// 1. If `--sender` argument was provided, that address is used.
+ /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.
+ /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.
+ function broadcast() external;
+
+ /// Has the next call (at this call depth only) create a transaction with the address provided
+ /// as the sender that can later be signed and sent onchain.
+ function broadcast(address signer) external;
+
+ /// Has the next call (at this call depth only) create a transaction with the private key
+ /// provided as the sender that can later be signed and sent onchain.
+ function broadcast(uint256 privateKey) external;
+
+ /// Returns addresses of available unlocked wallets in the script environment.
+ function getWallets() external view returns (address[] memory wallets);
+
+ /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction
+ function signAndAttachDelegation(address implementation, uint256 privateKey)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction for specific nonce
+ function signAndAttachDelegation(address implementation, uint256 privateKey, uint64 nonce)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction, with optional cross-chain validity.
+ function signAndAttachDelegation(address implementation, uint256 privateKey, bool crossChain)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization for delegation
+ function signDelegation(address implementation, uint256 privateKey)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization for delegation for specific nonce
+ function signDelegation(address implementation, uint256 privateKey, uint64 nonce)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Sign an EIP-7702 authorization for delegation, with optional cross-chain validity.
+ function signDelegation(address implementation, uint256 privateKey, bool crossChain)
+ external
+ returns (SignedDelegation memory signedDelegation);
+
+ /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.
+ /// Broadcasting address is determined by checking the following in order:
+ /// 1. If `--sender` argument was provided, that address is used.
+ /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.
+ /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.
+ function startBroadcast() external;
+
+ /// Has all subsequent calls (at this call depth only) create transactions with the address
+ /// provided that can later be signed and sent onchain.
+ function startBroadcast(address signer) external;
+
+ /// Has all subsequent calls (at this call depth only) create transactions with the private key
+ /// provided that can later be signed and sent onchain.
+ function startBroadcast(uint256 privateKey) external;
+
+ /// Stops collecting onchain transactions.
+ function stopBroadcast() external;
+
+ // ======== String ========
+
+ /// Returns true if `search` is found in `subject`, false otherwise.
+ function contains(string calldata subject, string calldata search) external pure returns (bool result);
+
+ /// Returns the index of the first occurrence of a `key` in an `input` string.
+ /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.
+ /// Returns 0 in case of an empty `key`.
+ function indexOf(string calldata input, string calldata key) external pure returns (uint256);
+
+ /// Parses the given `string` into an `address`.
+ function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);
+
+ /// Parses the given `string` into a `bool`.
+ function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);
+
+ /// Parses the given `string` into `bytes`.
+ function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);
+
+ /// Parses the given `string` into a `bytes32`.
+ function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);
+
+ /// Parses the given `string` into a `int256`.
+ function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);
+
+ /// Parses the given `string` into a `uint256`.
+ function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);
+
+ /// Replaces occurrences of `from` in the given `string` with `to`.
+ function replace(string calldata input, string calldata from, string calldata to)
+ external
+ pure
+ returns (string memory output);
+
+ /// Splits the given `string` into an array of strings divided by the `delimiter`.
+ function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);
+
+ /// Converts the given `string` value to Lowercase.
+ function toLowercase(string calldata input) external pure returns (string memory output);
+
+ /// Converts the given value to a `string`.
+ function toString(address value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bytes calldata value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bytes32 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bool value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(uint256 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(int256 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given `string` value to Uppercase.
+ function toUppercase(string calldata input) external pure returns (string memory output);
+
+ /// Trims leading and trailing whitespace from the given `string` value.
+ function trim(string calldata input) external pure returns (string memory output);
+
+ // ======== Testing ========
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message.
+ function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqAbsDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message.
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqAbsDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Includes error message into revert string on failure.
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Includes error message into revert string on failure.
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message.
+ function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals)
+ external
+ pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message.
+ function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals)
+ external
+ pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Includes error message into revert string on failure.
+ function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error)
+ external
+ pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Includes error message into revert string on failure.
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error)
+ external
+ pure;
+
+ /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `bool` values are equal.
+ function assertEq(bool left, bool right) external pure;
+
+ /// Asserts that two `bool` values are equal and includes error message into revert string on failure.
+ function assertEq(bool left, bool right, string calldata error) external pure;
+
+ /// Asserts that two `string` values are equal.
+ function assertEq(string calldata left, string calldata right) external pure;
+
+ /// Asserts that two `string` values are equal and includes error message into revert string on failure.
+ function assertEq(string calldata left, string calldata right, string calldata error) external pure;
+
+ /// Asserts that two `bytes` values are equal.
+ function assertEq(bytes calldata left, bytes calldata right) external pure;
+
+ /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bool` values are equal.
+ function assertEq(bool[] calldata left, bool[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.
+ function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `uint256 values are equal.
+ function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.
+ function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `int256` values are equal.
+ function assertEq(int256[] calldata left, int256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.
+ function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are equal.
+ function assertEq(uint256 left, uint256 right) external pure;
+
+ /// Asserts that two arrays of `address` values are equal.
+ function assertEq(address[] calldata left, address[] calldata right) external pure;
+
+ /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.
+ function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are equal.
+ function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `string` values are equal.
+ function assertEq(string[] calldata left, string[] calldata right) external pure;
+
+ /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.
+ function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes` values are equal.
+ function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.
+ function assertEq(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are equal.
+ function assertEq(int256 left, int256 right) external pure;
+
+ /// Asserts that two `int256` values are equal and includes error message into revert string on failure.
+ function assertEq(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `address` values are equal.
+ function assertEq(address left, address right) external pure;
+
+ /// Asserts that two `address` values are equal and includes error message into revert string on failure.
+ function assertEq(address left, address right, string calldata error) external pure;
+
+ /// Asserts that two `bytes32` values are equal.
+ function assertEq(bytes32 left, bytes32 right) external pure;
+
+ /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;
+
+ /// Asserts that the given condition is false.
+ function assertFalse(bool condition) external pure;
+
+ /// Asserts that the given condition is false and includes error message into revert string on failure.
+ function assertFalse(bool condition, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ function assertGe(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertGe(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ function assertGe(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertGe(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message.
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message.
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ function assertGt(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Includes error message into revert string on failure.
+ function assertGt(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ function assertGt(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Includes error message into revert string on failure.
+ function assertGt(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ function assertLe(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertLe(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ function assertLe(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertLe(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message.
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message.
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ function assertLt(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Includes error message into revert string on failure.
+ function assertLt(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ function assertLt(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Includes error message into revert string on failure.
+ function assertLt(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `bool` values are not equal.
+ function assertNotEq(bool left, bool right) external pure;
+
+ /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bool left, bool right, string calldata error) external pure;
+
+ /// Asserts that two `string` values are not equal.
+ function assertNotEq(string calldata left, string calldata right) external pure;
+
+ /// Asserts that two `string` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;
+
+ /// Asserts that two `bytes` values are not equal.
+ function assertNotEq(bytes calldata left, bytes calldata right) external pure;
+
+ /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bool` values are not equal.
+ function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `uint256` values are not equal.
+ function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `int256` values are not equal.
+ function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal.
+ function assertNotEq(uint256 left, uint256 right) external pure;
+
+ /// Asserts that two arrays of `address` values are not equal.
+ function assertNotEq(address[] calldata left, address[] calldata right) external pure;
+
+ /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are not equal.
+ function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `string` values are not equal.
+ function assertNotEq(string[] calldata left, string[] calldata right) external pure;
+
+ /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes` values are not equal.
+ function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are not equal.
+ function assertNotEq(int256 left, int256 right) external pure;
+
+ /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `address` values are not equal.
+ function assertNotEq(address left, address right) external pure;
+
+ /// Asserts that two `address` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(address left, address right, string calldata error) external pure;
+
+ /// Asserts that two `bytes32` values are not equal.
+ function assertNotEq(bytes32 left, bytes32 right) external pure;
+
+ /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;
+
+ /// Asserts that the given condition is true.
+ function assertTrue(bool condition) external pure;
+
+ /// Asserts that the given condition is true and includes error message into revert string on failure.
+ function assertTrue(bool condition, string calldata error) external pure;
+
+ /// If the condition is false, discard this run's fuzz inputs and generate new ones.
+ function assume(bool condition) external pure;
+
+ /// Discard this run's fuzz inputs and generate new ones if next call reverted.
+ function assumeNoRevert() external pure;
+
+ /// Discard this run's fuzz inputs and generate new ones if next call reverts with the potential revert parameters.
+ function assumeNoRevert(PotentialRevert calldata potentialRevert) external pure;
+
+ /// Discard this run's fuzz inputs and generate new ones if next call reverts with the any of the potential revert parameters.
+ function assumeNoRevert(PotentialRevert[] calldata potentialReverts) external pure;
+
+ /// Writes a breakpoint to jump to in the debugger.
+ function breakpoint(string calldata char) external pure;
+
+ /// Writes a conditional breakpoint to jump to in the debugger.
+ function breakpoint(string calldata char, bool value) external pure;
+
+ /// Returns true if the current Foundry version is greater than or equal to the given version.
+ /// The given version string must be in the format `major.minor.patch`.
+ /// This is equivalent to `foundryVersionCmp(version) >= 0`.
+ function foundryVersionAtLeast(string calldata version) external view returns (bool);
+
+ /// Compares the current Foundry version with the given version string.
+ /// The given version string must be in the format `major.minor.patch`.
+ /// Returns:
+ /// -1 if current Foundry version is less than the given version
+ /// 0 if current Foundry version equals the given version
+ /// 1 if current Foundry version is greater than the given version
+ /// This result can then be used with a comparison operator against `0`.
+ /// For example, to check if the current Foundry version is greater than or equal to `1.0.0`:
+ /// `if (foundryVersionCmp("1.0.0") >= 0) { ... }`
+ function foundryVersionCmp(string calldata version) external view returns (int256);
+
+ /// Returns a Chain struct for specific alias
+ function getChain(string calldata chainAlias) external view returns (Chain memory chain);
+
+ /// Returns a Chain struct for specific chainId
+ function getChain(uint256 chainId) external view returns (Chain memory chain);
+
+ /// Returns the Foundry version.
+ /// Format: -+..
+ /// Sample output: 0.3.0-nightly+3cb96bde9b.1737036656.debug
+ /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.
+ /// For reliable version comparisons, use UNIX format (e.g., >= 1700000000)
+ /// to compare timestamps while ignoring minor time differences.
+ function getFoundryVersion() external view returns (string memory version);
+
+ /// Returns the RPC url for the given alias.
+ function rpcUrl(string calldata rpcAlias) external view returns (string memory json);
+
+ /// Returns all rpc urls and their aliases as structs.
+ function rpcUrlStructs() external view returns (Rpc[] memory urls);
+
+ /// Returns all rpc urls and their aliases `[alias, url][]`.
+ function rpcUrls() external view returns (string[2][] memory urls);
+
+ /// Suspends execution of the main thread for `duration` milliseconds.
+ function sleep(uint256 duration) external;
+
+ // ======== Toml ========
+
+ /// Checks if `key` exists in a TOML table.
+ function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);
+
+ /// Parses a string of TOML data at `key` and coerces it to `address`.
+ function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);
+
+ /// Parses a string of TOML data at `key` and coerces it to `address[]`.
+ function parseTomlAddressArray(string calldata toml, string calldata key)
+ external
+ pure
+ returns (address[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bool`.
+ function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bool[]`.
+ function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes`.
+ function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes32`.
+ function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.
+ function parseTomlBytes32Array(string calldata toml, string calldata key)
+ external
+ pure
+ returns (bytes32[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.
+ function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `int256`.
+ function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);
+
+ /// Parses a string of TOML data at `key` and coerces it to `int256[]`.
+ function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);
+
+ /// Returns an array of all the keys in a TOML table.
+ function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);
+
+ /// Parses a string of TOML data at `key` and coerces it to `string`.
+ function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `string[]`.
+ function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.
+ function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.
+ function parseTomlType(string calldata toml, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.
+ function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `uint256`.
+ function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);
+
+ /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.
+ function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);
+
+ /// ABI-encodes a TOML table.
+ function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);
+
+ /// ABI-encodes a TOML table at `key`.
+ function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);
+
+ /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.
+ function writeToml(string calldata json, string calldata path) external;
+
+ /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key =
+ /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.
+ /// This cheatcode will create new keys if they didn't previously exist.
+ function writeToml(string calldata json, string calldata path, string calldata valueKey) external;
+
+ // ======== Utilities ========
+
+ /// Returns an uint256 value bounded in given range and different from the current one.
+ function bound(uint256 current, uint256 min, uint256 max) external view returns (uint256);
+
+ /// Returns an int256 value bounded in given range and different from the current one.
+ function bound(int256 current, int256 min, int256 max) external view returns (int256);
+
+ /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer)
+ external
+ pure
+ returns (address);
+
+ /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);
+
+ /// Compute the address a contract will be deployed at for a given deployer address and nonce.
+ function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);
+
+ /// Utility cheatcode to copy storage of `from` contract to another `to` contract.
+ function copyStorage(address from, address to) external;
+
+ /// Generates the struct hash of the canonical EIP-712 type representation and its abi-encoded data.
+ /// Supports 2 different inputs:
+ /// 1. Name of the type (i.e. "PermitSingle"):
+ /// * requires previous binding generation with `forge bind-json`.
+ /// * bindings will be retrieved from the path configured in `foundry.toml`.
+ /// 2. String representation of the type (i.e. "Foo(Bar bar) Bar(uint256 baz)").
+ /// * Note: the cheatcode will use the canonical type even if the input is malformated
+ /// with the wrong order of elements or with extra whitespaces.
+ function eip712HashStruct(string calldata typeNameOrDefinition, bytes calldata abiEncodedData)
+ external
+ pure
+ returns (bytes32 typeHash);
+
+ /// Generates the struct hash of the canonical EIP-712 type representation and its abi-encoded data.
+ /// Requires previous binding generation with `forge bind-json`.
+ /// Params:
+ /// * `bindingsPath`: path where the output of `forge bind-json` is stored.
+ /// * `typeName`: Name of the type (i.e. "PermitSingle").
+ /// * `abiEncodedData`: ABI-encoded data for the struct that is being hashed.
+ function eip712HashStruct(string calldata bindingsPath, string calldata typeName, bytes calldata abiEncodedData)
+ external
+ pure
+ returns (bytes32 typeHash);
+
+ /// Generates the hash of the canonical EIP-712 type representation.
+ /// Supports 2 different inputs:
+ /// 1. Name of the type (i.e. "Transaction"):
+ /// * requires previous binding generation with `forge bind-json`.
+ /// * bindings will be retrieved from the path configured in `foundry.toml`.
+ /// 2. String representation of the type (i.e. "Foo(Bar bar) Bar(uint256 baz)").
+ /// * Note: the cheatcode will output the canonical type even if the input is malformated
+ /// with the wrong order of elements or with extra whitespaces.
+ function eip712HashType(string calldata typeNameOrDefinition) external pure returns (bytes32 typeHash);
+
+ /// Generates the hash of the canonical EIP-712 type representation.
+ /// Requires previous binding generation with `forge bind-json`.
+ /// Params:
+ /// * `bindingsPath`: path where the output of `forge bind-json` is stored.
+ /// * `typeName`: Name of the type (i.e. "Transaction").
+ function eip712HashType(string calldata bindingsPath, string calldata typeName)
+ external
+ pure
+ returns (bytes32 typeHash);
+
+ /// Generates a ready-to-sign digest of human-readable typed data following the EIP-712 standard.
+ function eip712HashTypedData(string calldata jsonData) external pure returns (bytes32 digest);
+
+ /// Returns ENS namehash for provided string.
+ function ensNamehash(string calldata name) external pure returns (bytes32);
+
+ /// Gets the label for the specified address.
+ function getLabel(address account) external view returns (string memory currentLabel);
+
+ /// Labels an address in call traces.
+ function label(address account, string calldata newLabel) external;
+
+ /// Pauses collection of call traces. Useful in cases when you want to skip tracing of
+ /// complex calls which are not useful for debugging.
+ function pauseTracing() external view;
+
+ /// Returns a random `address`.
+ function randomAddress() external view returns (address);
+
+ /// Returns a random `bool`.
+ function randomBool() external view returns (bool);
+
+ /// Returns a random byte array value of the given length.
+ function randomBytes(uint256 len) external view returns (bytes memory);
+
+ /// Returns a random fixed-size byte array of length 4.
+ function randomBytes4() external view returns (bytes4);
+
+ /// Returns a random fixed-size byte array of length 8.
+ function randomBytes8() external view returns (bytes8);
+
+ /// Returns a random `int256` value.
+ function randomInt() external view returns (int256);
+
+ /// Returns a random `int256` value of given bits.
+ function randomInt(uint256 bits) external view returns (int256);
+
+ /// Returns a random uint256 value.
+ function randomUint() external view returns (uint256);
+
+ /// Returns random uint256 value between the provided range (=min..=max).
+ function randomUint(uint256 min, uint256 max) external view returns (uint256);
+
+ /// Returns a random `uint256` value of given bits.
+ function randomUint(uint256 bits) external view returns (uint256);
+
+ /// Unpauses collection of call traces.
+ function resumeTracing() external view;
+
+ /// Utility cheatcode to set arbitrary storage for given target address.
+ function setArbitraryStorage(address target) external;
+
+ /// Utility cheatcode to set arbitrary storage for given target address and overwrite
+ /// any storage slots that have been previously set.
+ function setArbitraryStorage(address target, bool overwrite) external;
+
+ /// Set RNG seed.
+ function setSeed(uint256 seed) external;
+
+ /// Randomly shuffles an array.
+ function shuffle(uint256[] calldata array) external returns (uint256[] memory);
+
+ /// Sorts an array in ascending order.
+ function sort(uint256[] calldata array) external returns (uint256[] memory);
+
+ /// Encodes a `bytes` value to a base64url string.
+ function toBase64URL(bytes calldata data) external pure returns (string memory);
+
+ /// Encodes a `string` value to a base64url string.
+ function toBase64URL(string calldata data) external pure returns (string memory);
+
+ /// Encodes a `bytes` value to a base64 string.
+ function toBase64(bytes calldata data) external pure returns (string memory);
+
+ /// Encodes a `string` value to a base64 string.
+ function toBase64(string calldata data) external pure returns (string memory);
+}
+
+/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used
+/// in tests, but it is not recommended to use these cheats in scripts.
+interface Vm is VmSafe {
+ // ======== EVM ========
+
+ /// Utility cheatcode to set an EIP-2930 access list for all subsequent transactions.
+ function accessList(AccessListItem[] calldata access) external;
+
+ /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.
+ function activeFork() external view returns (uint256 forkId);
+
+ /// In forking mode, explicitly grant the given address cheatcode access.
+ function allowCheatcodes(address account) external;
+
+ /// Sets `block.blobbasefee`
+ function blobBaseFee(uint256 newBlobBaseFee) external;
+
+ /// Sets the blobhashes in the transaction.
+ /// Not available on EVM versions before Cancun.
+ /// If used on unsupported EVM versions it will revert.
+ function blobhashes(bytes32[] calldata hashes) external;
+
+ /// Sets `block.chainid`.
+ function chainId(uint256 newChainId) external;
+
+ /// Clears all mocked calls.
+ function clearMockedCalls() external;
+
+ /// Clones a source account code, state, balance and nonce to a target account and updates in-memory EVM state.
+ function cloneAccount(address source, address target) external;
+
+ /// Sets `block.coinbase`.
+ function coinbase(address newCoinbase) external;
+
+ /// Marks the slots of an account and the account address as cold.
+ function cool(address target) external;
+
+ /// Utility cheatcode to mark specific storage slot as cold, simulating no prior read.
+ function coolSlot(address target, bytes32 slot) external;
+
+ /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias) external returns (uint256 forkId);
+
+ /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
+
+ /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,
+ /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
+
+ /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);
+
+ /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
+
+ /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,
+ /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
+
+ /// Sets an address' balance.
+ function deal(address account, uint256 newBalance) external;
+
+ /// Removes the snapshot with the given ID created by `snapshot`.
+ /// Takes the snapshot ID to delete.
+ /// Returns `true` if the snapshot was successfully deleted.
+ /// Returns `false` if the snapshot does not exist.
+ function deleteStateSnapshot(uint256 snapshotId) external returns (bool success);
+
+ /// Removes _all_ snapshots previously created by `snapshot`.
+ function deleteStateSnapshots() external;
+
+ /// Sets `block.difficulty`.
+ /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.
+ /// Reverts if used on unsupported EVM versions.
+ function difficulty(uint256 newDifficulty) external;
+
+ /// Dump a genesis JSON file's `allocs` to disk.
+ function dumpState(string calldata pathToStateJson) external;
+
+ /// Sets an address' code.
+ function etch(address target, bytes calldata newRuntimeBytecode) external;
+
+ /// Sets `block.basefee`.
+ function fee(uint256 newBasefee) external;
+
+ /// Gets the blockhashes from the current transaction.
+ /// Not available on EVM versions before Cancun.
+ /// If used on unsupported EVM versions it will revert.
+ function getBlobhashes() external view returns (bytes32[] memory hashes);
+
+ /// Returns true if the account is marked as persistent.
+ function isPersistent(address account) external view returns (bool persistent);
+
+ /// Load a genesis JSON file's `allocs` into the in-memory EVM state.
+ function loadAllocs(string calldata pathToAllocsJson) external;
+
+ /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup
+ /// Meaning, changes made to the state of this account will be kept when switching forks.
+ function makePersistent(address account) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address account0, address account1) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address account0, address account1, address account2) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address[] calldata accounts) external;
+
+ /// Reverts a call to an address with specified revert data.
+ function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;
+
+ /// Reverts a call to an address with a specific `msg.value`, with specified revert data.
+ function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)
+ external;
+
+ /// Reverts a call to an address with specified revert data.
+ /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
+ function mockCallRevert(address callee, bytes4 data, bytes calldata revertData) external;
+
+ /// Reverts a call to an address with a specific `msg.value`, with specified revert data.
+ /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
+ function mockCallRevert(address callee, uint256 msgValue, bytes4 data, bytes calldata revertData) external;
+
+ /// Mocks a call to an address, returning specified data.
+ /// Calldata can either be strict or a partial match, e.g. if you only
+ /// pass a Solidity selector to the expected calldata, then the entire Solidity
+ /// function will be mocked.
+ function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;
+
+ /// Mocks a call to an address with a specific `msg.value`, returning specified data.
+ /// Calldata match takes precedence over `msg.value` in case of ambiguity.
+ function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;
+
+ /// Mocks a call to an address, returning specified data.
+ /// Calldata can either be strict or a partial match, e.g. if you only
+ /// pass a Solidity selector to the expected calldata, then the entire Solidity
+ /// function will be mocked.
+ /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
+ function mockCall(address callee, bytes4 data, bytes calldata returnData) external;
+
+ /// Mocks a call to an address with a specific `msg.value`, returning specified data.
+ /// Calldata match takes precedence over `msg.value` in case of ambiguity.
+ /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
+ function mockCall(address callee, uint256 msgValue, bytes4 data, bytes calldata returnData) external;
+
+ /// Mocks multiple calls to an address, returning specified data for each call.
+ function mockCalls(address callee, bytes calldata data, bytes[] calldata returnData) external;
+
+ /// Mocks multiple calls to an address with a specific `msg.value`, returning specified data for each call.
+ function mockCalls(address callee, uint256 msgValue, bytes calldata data, bytes[] calldata returnData) external;
+
+ /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls
+ /// `target` with the same calldata. This functionality is similar to a delegate call made to
+ /// `target` contract from `callee`.
+ /// Can be used to substitute a call to a function with another implementation that captures
+ /// the primary logic of the original function but is easier to reason about.
+ /// If calldata is not a strict match then partial match by selector is attempted.
+ function mockFunction(address callee, address target, bytes calldata data) external;
+
+ /// Utility cheatcode to remove any EIP-2930 access list set by `accessList` cheatcode.
+ function noAccessList() external;
+
+ /// Sets the *next* call's `msg.sender` to be the input address.
+ function prank(address msgSender) external;
+
+ /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.
+ function prank(address msgSender, address txOrigin) external;
+
+ /// Sets the *next* delegate call's `msg.sender` to be the input address.
+ function prank(address msgSender, bool delegateCall) external;
+
+ /// Sets the *next* delegate call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.
+ function prank(address msgSender, address txOrigin, bool delegateCall) external;
+
+ /// Sets `block.prevrandao`.
+ /// Not available on EVM versions before Paris. Use `difficulty` instead.
+ /// If used on unsupported EVM versions it will revert.
+ function prevrandao(bytes32 newPrevrandao) external;
+
+ /// Sets `block.prevrandao`.
+ /// Not available on EVM versions before Paris. Use `difficulty` instead.
+ /// If used on unsupported EVM versions it will revert.
+ function prevrandao(uint256 newPrevrandao) external;
+
+ /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.
+ function readCallers() external view returns (CallerMode callerMode, address msgSender, address txOrigin);
+
+ /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.
+ function resetNonce(address account) external;
+
+ /// Revert the state of the EVM to a previous snapshot
+ /// Takes the snapshot ID to revert to.
+ /// Returns `true` if the snapshot was successfully reverted.
+ /// Returns `false` if the snapshot does not exist.
+ /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteStateSnapshot`.
+ function revertToState(uint256 snapshotId) external returns (bool success);
+
+ /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots
+ /// Takes the snapshot ID to revert to.
+ /// Returns `true` if the snapshot was successfully reverted and deleted.
+ /// Returns `false` if the snapshot does not exist.
+ function revertToStateAndDelete(uint256 snapshotId) external returns (bool success);
+
+ /// Revokes persistent status from the address, previously added via `makePersistent`.
+ function revokePersistent(address account) external;
+
+ /// See `revokePersistent(address)`.
+ function revokePersistent(address[] calldata accounts) external;
+
+ /// Sets `block.height`.
+ function roll(uint256 newHeight) external;
+
+ /// Updates the currently active fork to given block number
+ /// This is similar to `roll` but for the currently active fork.
+ function rollFork(uint256 blockNumber) external;
+
+ /// Updates the currently active fork to given transaction. This will `rollFork` with the number
+ /// of the block the transaction was mined in and replays all transaction mined before it in the block.
+ function rollFork(bytes32 txHash) external;
+
+ /// Updates the given fork to given block number.
+ function rollFork(uint256 forkId, uint256 blockNumber) external;
+
+ /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.
+ function rollFork(uint256 forkId, bytes32 txHash) external;
+
+ /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.
+ function selectFork(uint256 forkId) external;
+
+ /// Set blockhash for the current block.
+ /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.
+ function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;
+
+ /// Sets the nonce of an account. Must be higher than the current nonce of the account.
+ function setNonce(address account, uint64 newNonce) external;
+
+ /// Sets the nonce of an account to an arbitrary value.
+ function setNonceUnsafe(address account, uint64 newNonce) external;
+
+ /// Snapshot capture the gas usage of the last call by name from the callee perspective.
+ function snapshotGasLastCall(string calldata name) external returns (uint256 gasUsed);
+
+ /// Snapshot capture the gas usage of the last call by name in a group from the callee perspective.
+ function snapshotGasLastCall(string calldata group, string calldata name) external returns (uint256 gasUsed);
+
+ /// Snapshot the current state of the evm.
+ /// Returns the ID of the snapshot that was created.
+ /// To revert a snapshot use `revertToState`.
+ function snapshotState() external returns (uint256 snapshotId);
+
+ /// Snapshot capture an arbitrary numerical value by name.
+ /// The group name is derived from the contract name.
+ function snapshotValue(string calldata name, uint256 value) external;
+
+ /// Snapshot capture an arbitrary numerical value by name in a group.
+ function snapshotValue(string calldata group, string calldata name, uint256 value) external;
+
+ /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.
+ function startPrank(address msgSender) external;
+
+ /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.
+ function startPrank(address msgSender, address txOrigin) external;
+
+ /// Sets all subsequent delegate calls' `msg.sender` to be the input address until `stopPrank` is called.
+ function startPrank(address msgSender, bool delegateCall) external;
+
+ /// Sets all subsequent delegate calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.
+ function startPrank(address msgSender, address txOrigin, bool delegateCall) external;
+
+ /// Start a snapshot capture of the current gas usage by name.
+ /// The group name is derived from the contract name.
+ function startSnapshotGas(string calldata name) external;
+
+ /// Start a snapshot capture of the current gas usage by name in a group.
+ function startSnapshotGas(string calldata group, string calldata name) external;
+
+ /// Resets subsequent calls' `msg.sender` to be `address(this)`.
+ function stopPrank() external;
+
+ /// Stop the snapshot capture of the current gas by latest snapshot name, capturing the gas used since the start.
+ function stopSnapshotGas() external returns (uint256 gasUsed);
+
+ /// Stop the snapshot capture of the current gas usage by name, capturing the gas used since the start.
+ /// The group name is derived from the contract name.
+ function stopSnapshotGas(string calldata name) external returns (uint256 gasUsed);
+
+ /// Stop the snapshot capture of the current gas usage by name in a group, capturing the gas used since the start.
+ function stopSnapshotGas(string calldata group, string calldata name) external returns (uint256 gasUsed);
+
+ /// Stores a value to an address' storage slot.
+ function store(address target, bytes32 slot, bytes32 value) external;
+
+ /// Fetches the given transaction from the active fork and executes it on the current state.
+ function transact(bytes32 txHash) external;
+
+ /// Fetches the given transaction from the given fork and executes it on the current state.
+ function transact(uint256 forkId, bytes32 txHash) external;
+
+ /// Sets `tx.gasprice`.
+ function txGasPrice(uint256 newGasPrice) external;
+
+ /// Utility cheatcode to mark specific storage slot as warm, simulating a prior read.
+ function warmSlot(address target, bytes32 slot) external;
+
+ /// Sets `block.timestamp`.
+ function warp(uint256 newTimestamp) external;
+
+ /// `deleteSnapshot` is being deprecated in favor of `deleteStateSnapshot`. It will be removed in future versions.
+ function deleteSnapshot(uint256 snapshotId) external returns (bool success);
+
+ /// `deleteSnapshots` is being deprecated in favor of `deleteStateSnapshots`. It will be removed in future versions.
+ function deleteSnapshots() external;
+
+ /// `revertToAndDelete` is being deprecated in favor of `revertToStateAndDelete`. It will be removed in future versions.
+ function revertToAndDelete(uint256 snapshotId) external returns (bool success);
+
+ /// `revertTo` is being deprecated in favor of `revertToState`. It will be removed in future versions.
+ function revertTo(uint256 snapshotId) external returns (bool success);
+
+ /// `snapshot` is being deprecated in favor of `snapshotState`. It will be removed in future versions.
+ function snapshot() external returns (uint256 snapshotId);
+
+ // ======== Testing ========
+
+ /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.
+ function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;
+
+ /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.
+ function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)
+ external;
+
+ /// Expects a call to an address with the specified calldata.
+ /// Calldata can either be a strict or a partial match.
+ function expectCall(address callee, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified calldata.
+ function expectCall(address callee, bytes calldata data, uint64 count) external;
+
+ /// Expects a call to an address with the specified `msg.value` and calldata.
+ function expectCall(address callee, uint256 msgValue, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified `msg.value` and calldata.
+ function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;
+
+ /// Expect a call to an address with the specified `msg.value`, gas, and calldata.
+ function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.
+ function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;
+
+ /// Expects the deployment of the specified bytecode by the specified address using the CREATE opcode
+ function expectCreate(bytes calldata bytecode, address deployer) external;
+
+ /// Expects the deployment of the specified bytecode by the specified address using the CREATE2 opcode
+ function expectCreate2(bytes calldata bytecode, address deployer) external;
+
+ /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).
+ /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
+ function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData)
+ external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmitAnonymous(
+ bool checkTopic0,
+ bool checkTopic1,
+ bool checkTopic2,
+ bool checkTopic3,
+ bool checkData,
+ address emitter
+ ) external;
+
+ /// Prepare an expected anonymous log with all topic and data checks enabled.
+ /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data.
+ function expectEmitAnonymous() external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmitAnonymous(address emitter) external;
+
+ /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).
+ /// Call this function, then emit an event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)
+ external;
+
+ /// Prepare an expected log with all topic and data checks enabled.
+ /// Call this function, then emit an event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data.
+ function expectEmit() external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmit(address emitter) external;
+
+ /// Expect a given number of logs with the provided topics.
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, uint64 count) external;
+
+ /// Expect a given number of logs from a specific emitter with the provided topics.
+ function expectEmit(
+ bool checkTopic1,
+ bool checkTopic2,
+ bool checkTopic3,
+ bool checkData,
+ address emitter,
+ uint64 count
+ ) external;
+
+ /// Expect a given number of logs with all topic and data checks enabled.
+ function expectEmit(uint64 count) external;
+
+ /// Expect a given number of logs from a specific emitter with all topic and data checks enabled.
+ function expectEmit(address emitter, uint64 count) external;
+
+ /// Expects an error on next call that starts with the revert data.
+ function expectPartialRevert(bytes4 revertData) external;
+
+ /// Expects an error on next call to reverter address, that starts with the revert data.
+ function expectPartialRevert(bytes4 revertData, address reverter) external;
+
+ /// Expects an error on next call with any revert data.
+ function expectRevert() external;
+
+ /// Expects an error on next call that exactly matches the revert data.
+ function expectRevert(bytes4 revertData) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls from the reverter address that match the revert data.
+ function expectRevert(bytes4 revertData, address reverter, uint64 count) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls from the reverter address that exactly match the revert data.
+ function expectRevert(bytes calldata revertData, address reverter, uint64 count) external;
+
+ /// Expects an error on next call that exactly matches the revert data.
+ function expectRevert(bytes calldata revertData) external;
+
+ /// Expects an error with any revert data on next call to reverter address.
+ function expectRevert(address reverter) external;
+
+ /// Expects an error from reverter address on next call, with any revert data.
+ function expectRevert(bytes4 revertData, address reverter) external;
+
+ /// Expects an error from reverter address on next call, that exactly matches the revert data.
+ function expectRevert(bytes calldata revertData, address reverter) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls with any revert data or reverter.
+ function expectRevert(uint64 count) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls that match the revert data.
+ function expectRevert(bytes4 revertData, uint64 count) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls that exactly match the revert data.
+ function expectRevert(bytes calldata revertData, uint64 count) external;
+
+ /// Expects a `count` number of reverts from the upcoming calls from the reverter address.
+ function expectRevert(address reverter, uint64 count) external;
+
+ /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other
+ /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.
+ function expectSafeMemory(uint64 min, uint64 max) external;
+
+ /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.
+ /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges
+ /// to the set.
+ function expectSafeMemoryCall(uint64 min, uint64 max) external;
+
+ /// Marks a test as skipped. Must be called at the top level of a test.
+ function skip(bool skipTest) external;
+
+ /// Marks a test as skipped with a reason. Must be called at the top level of a test.
+ function skip(bool skipTest, string calldata reason) external;
+
+ /// Stops all safe memory expectation in the current subcontext.
+ function stopExpectSafeMemory() external;
+
+ // ======== Utilities ========
+
+ /// Causes the next contract creation (via new) to fail and return its initcode in the returndata buffer.
+ /// This allows type-safe access to the initcode payload that would be used for contract creation.
+ /// Example usage:
+ /// vm.interceptInitcode();
+ /// bytes memory initcode;
+ /// try new MyContract(param1, param2) { assert(false); }
+ /// catch (bytes memory interceptedInitcode) { initcode = interceptedInitcode; }
+ function interceptInitcode() external;
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/console.sol b/lib/signals-implicit-mode/lib/forge-std/src/console.sol
new file mode 100644
index 000000000..4fdb6679e
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/console.sol
@@ -0,0 +1,1560 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+library console {
+ address constant CONSOLE_ADDRESS =
+ 0x000000000000000000636F6e736F6c652e6c6f67;
+
+ function _sendLogPayloadImplementation(bytes memory payload) internal view {
+ address consoleAddress = CONSOLE_ADDRESS;
+ /// @solidity memory-safe-assembly
+ assembly {
+ pop(
+ staticcall(
+ gas(),
+ consoleAddress,
+ add(payload, 32),
+ mload(payload),
+ 0,
+ 0
+ )
+ )
+ }
+ }
+
+ function _castToPure(
+ function(bytes memory) internal view fnIn
+ ) internal pure returns (function(bytes memory) pure fnOut) {
+ assembly {
+ fnOut := fnIn
+ }
+ }
+
+ function _sendLogPayload(bytes memory payload) internal pure {
+ _castToPure(_sendLogPayloadImplementation)(payload);
+ }
+
+ function log() internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log()"));
+ }
+
+ function logInt(int256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
+ }
+
+ function logUint(uint256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
+ }
+
+ function logString(string memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function logBool(bool p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function logAddress(address p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function logBytes(bytes memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
+ }
+
+ function logBytes1(bytes1 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
+ }
+
+ function logBytes2(bytes2 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
+ }
+
+ function logBytes3(bytes3 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
+ }
+
+ function logBytes4(bytes4 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
+ }
+
+ function logBytes5(bytes5 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
+ }
+
+ function logBytes6(bytes6 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
+ }
+
+ function logBytes7(bytes7 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
+ }
+
+ function logBytes8(bytes8 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
+ }
+
+ function logBytes9(bytes9 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
+ }
+
+ function logBytes10(bytes10 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
+ }
+
+ function logBytes11(bytes11 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
+ }
+
+ function logBytes12(bytes12 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
+ }
+
+ function logBytes13(bytes13 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
+ }
+
+ function logBytes14(bytes14 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
+ }
+
+ function logBytes15(bytes15 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
+ }
+
+ function logBytes16(bytes16 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
+ }
+
+ function logBytes17(bytes17 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
+ }
+
+ function logBytes18(bytes18 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
+ }
+
+ function logBytes19(bytes19 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
+ }
+
+ function logBytes20(bytes20 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
+ }
+
+ function logBytes21(bytes21 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
+ }
+
+ function logBytes22(bytes22 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
+ }
+
+ function logBytes23(bytes23 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
+ }
+
+ function logBytes24(bytes24 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
+ }
+
+ function logBytes25(bytes25 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
+ }
+
+ function logBytes26(bytes26 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
+ }
+
+ function logBytes27(bytes27 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
+ }
+
+ function logBytes28(bytes28 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
+ }
+
+ function logBytes29(bytes29 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
+ }
+
+ function logBytes30(bytes30 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
+ }
+
+ function logBytes31(bytes31 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
+ }
+
+ function logBytes32(bytes32 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
+ }
+
+ function log(uint256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
+ }
+
+ function log(int256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
+ }
+
+ function log(string memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function log(bool p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function log(address p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function log(uint256 p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
+ }
+
+ function log(uint256 p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
+ }
+
+ function log(uint256 p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
+ }
+
+ function log(uint256 p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
+ }
+
+ function log(string memory p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
+ }
+
+ function log(string memory p0, int256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1));
+ }
+
+ function log(string memory p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
+ }
+
+ function log(string memory p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
+ }
+
+ function log(string memory p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
+ }
+
+ function log(bool p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
+ }
+
+ function log(bool p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
+ }
+
+ function log(bool p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
+ }
+
+ function log(bool p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
+ }
+
+ function log(address p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
+ }
+
+ function log(address p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
+ }
+
+ function log(address p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
+ }
+
+ function log(address p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/console2.sol b/lib/signals-implicit-mode/lib/forge-std/src/console2.sol
new file mode 100644
index 000000000..03531d91d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/console2.sol
@@ -0,0 +1,4 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+import {console as console2} from "./console.sol";
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC1155.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC1155.sol
new file mode 100644
index 000000000..ffc82984a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC1155.sol
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import {IERC165} from "./IERC165.sol";
+
+/// @title ERC-1155 Multi Token Standard
+/// @dev See https://eips.ethereum.org/EIPS/eip-1155
+/// Note: The ERC-165 identifier for this interface is 0xd9b67a26.
+interface IERC1155 is IERC165 {
+ /// @dev
+ /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
+ /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender).
+ /// - The `_from` argument MUST be the address of the holder whose balance is decreased.
+ /// - The `_to` argument MUST be the address of the recipient whose balance is increased.
+ /// - The `_id` argument MUST be the token type being transferred.
+ /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
+ /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
+ /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
+ event TransferSingle(
+ address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value
+ );
+
+ /// @dev
+ /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
+ /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender).
+ /// - The `_from` argument MUST be the address of the holder whose balance is decreased.
+ /// - The `_to` argument MUST be the address of the recipient whose balance is increased.
+ /// - The `_ids` argument MUST be the list of tokens being transferred.
+ /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
+ /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
+ /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
+ event TransferBatch(
+ address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values
+ );
+
+ /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled).
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+
+ /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986.
+ /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
+ event URI(string _value, uint256 indexed _id);
+
+ /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
+ /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
+ /// - MUST revert if `_to` is the zero address.
+ /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
+ /// - MUST revert on any other error.
+ /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
+ /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
+ /// @param _from Source address
+ /// @param _to Target address
+ /// @param _id ID of the token type
+ /// @param _value Transfer amount
+ /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
+ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
+
+ /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
+ /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
+ /// - MUST revert if `_to` is the zero address.
+ /// - MUST revert if length of `_ids` is not the same as length of `_values`.
+ /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
+ /// - MUST revert on any other error.
+ /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
+ /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
+ /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
+ /// @param _from Source address
+ /// @param _to Target address
+ /// @param _ids IDs of each token type (order and length must match _values array)
+ /// @param _values Transfer amounts per token type (order and length must match _ids array)
+ /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
+ function safeBatchTransferFrom(
+ address _from,
+ address _to,
+ uint256[] calldata _ids,
+ uint256[] calldata _values,
+ bytes calldata _data
+ ) external;
+
+ /// @notice Get the balance of an account's tokens.
+ /// @param _owner The address of the token holder
+ /// @param _id ID of the token
+ /// @return The _owner's balance of the token type requested
+ function balanceOf(address _owner, uint256 _id) external view returns (uint256);
+
+ /// @notice Get the balance of multiple account/token pairs
+ /// @param _owners The addresses of the token holders
+ /// @param _ids ID of the tokens
+ /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair)
+ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
+ external
+ view
+ returns (uint256[] memory);
+
+ /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
+ /// @dev MUST emit the ApprovalForAll event on success.
+ /// @param _operator Address to add to the set of authorized operators
+ /// @param _approved True if the operator is approved, false to revoke approval
+ function setApprovalForAll(address _operator, bool _approved) external;
+
+ /// @notice Queries the approval status of an operator for a given owner.
+ /// @param _owner The owner of the tokens
+ /// @param _operator Address of authorized operator
+ /// @return True if the operator is approved, false if not
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC165.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC165.sol
new file mode 100644
index 000000000..9af4bf800
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC165.sol
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+interface IERC165 {
+ /// @notice Query if a contract implements an interface
+ /// @param interfaceID The interface identifier, as specified in ERC-165
+ /// @dev Interface identification is specified in ERC-165. This function
+ /// uses less than 30,000 gas.
+ /// @return `true` if the contract implements `interfaceID` and
+ /// `interfaceID` is not 0xffffffff, `false` otherwise
+ function supportsInterface(bytes4 interfaceID) external view returns (bool);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC20.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC20.sol
new file mode 100644
index 000000000..ba40806c3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC20.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+/// @dev Interface of the ERC20 standard as defined in the EIP.
+/// @dev This includes the optional name, symbol, and decimals metadata.
+interface IERC20 {
+ /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).
+ event Transfer(address indexed from, address indexed to, uint256 value);
+
+ /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`
+ /// is the new allowance.
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ /// @notice Returns the amount of tokens in existence.
+ function totalSupply() external view returns (uint256);
+
+ /// @notice Returns the amount of tokens owned by `account`.
+ function balanceOf(address account) external view returns (uint256);
+
+ /// @notice Moves `amount` tokens from the caller's account to `to`.
+ function transfer(address to, uint256 amount) external returns (bool);
+
+ /// @notice Returns the remaining number of tokens that `spender` is allowed
+ /// to spend on behalf of `owner`
+ function allowance(address owner, address spender) external view returns (uint256);
+
+ /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.
+ /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.
+ /// `amount` is then deducted from the caller's allowance.
+ function transferFrom(address from, address to, uint256 amount) external returns (bool);
+
+ /// @notice Returns the name of the token.
+ function name() external view returns (string memory);
+
+ /// @notice Returns the symbol of the token.
+ function symbol() external view returns (string memory);
+
+ /// @notice Returns the decimals places of the token.
+ function decimals() external view returns (uint8);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC4626.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC4626.sol
new file mode 100644
index 000000000..c645a0fec
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC4626.sol
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import {IERC20} from "./IERC20.sol";
+
+/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in
+/// https://eips.ethereum.org/EIPS/eip-4626
+interface IERC4626 is IERC20 {
+ event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
+
+ event Withdraw(
+ address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
+ );
+
+ /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
+ /// @dev
+ /// - MUST be an ERC-20 token contract.
+ /// - MUST NOT revert.
+ function asset() external view returns (address assetTokenAddress);
+
+ /// @notice Returns the total amount of the underlying asset that is “managed” by Vault.
+ /// @dev
+ /// - SHOULD include any compounding that occurs from yield.
+ /// - MUST be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT revert.
+ function totalAssets() external view returns (uint256 totalManagedAssets);
+
+ /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal
+ /// scenario where all the conditions are met.
+ /// @dev
+ /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT show any variations depending on the caller.
+ /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ /// from.
+ function convertToShares(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal
+ /// scenario where all the conditions are met.
+ /// @dev
+ /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT show any variations depending on the caller.
+ /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ /// from.
+ function convertToAssets(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
+ /// through a deposit call.
+ /// @dev
+ /// - MUST return a limited value if receiver is subject to some deposit limit.
+ /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
+ /// - MUST NOT revert.
+ function maxDeposit(address receiver) external view returns (uint256 maxAssets);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
+ /// current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
+ /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
+ /// in the same transaction.
+ /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
+ /// deposit would be accepted, regardless if the user has enough tokens approved, etc.
+ /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ function previewDeposit(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
+ /// @dev
+ /// - MUST emit the Deposit event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// deposit execution, and are accounted for during deposit.
+ /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
+ /// approving enough underlying tokens to the Vault contract, etc).
+ ///
+ /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ function deposit(uint256 assets, address receiver) external returns (uint256 shares);
+
+ /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
+ /// @dev
+ /// - MUST return a limited value if receiver is subject to some mint limit.
+ /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
+ /// - MUST NOT revert.
+ function maxMint(address receiver) external view returns (uint256 maxShares);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
+ /// current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
+ /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
+ /// same transaction.
+ /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
+ /// would be accepted, regardless if the user has enough tokens approved, etc.
+ /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by minting.
+ function previewMint(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
+ /// @dev
+ /// - MUST emit the Deposit event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
+ /// execution, and are accounted for during mint.
+ /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
+ /// approving enough underlying tokens to the Vault contract, etc).
+ ///
+ /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ function mint(uint256 shares, address receiver) external returns (uint256 assets);
+
+ /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
+ /// Vault, through a withdrawal call.
+ /// @dev
+ /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ /// - MUST NOT revert.
+ function maxWithdraw(address owner) external view returns (uint256 maxAssets);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
+ /// given current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
+ /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
+ /// called
+ /// in the same transaction.
+ /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
+ /// the withdrawal would be accepted, regardless if the user has enough shares, etc.
+ /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ function previewWithdraw(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver.
+ /// @dev
+ /// - MUST emit the Withdraw event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// withdraw execution, and are accounted for during withdrawal.
+ /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
+ /// not having enough shares, etc).
+ ///
+ /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ /// Those methods should be performed separately.
+ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
+
+ /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
+ /// through a redeem call.
+ /// @dev
+ /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
+ /// - MUST NOT revert.
+ function maxRedeem(address owner) external view returns (uint256 maxShares);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
+ /// given current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
+ /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
+ /// same transaction.
+ /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
+ /// redemption would be accepted, regardless if the user has enough shares, etc.
+ /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by redeeming.
+ function previewRedeem(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver.
+ /// @dev
+ /// - MUST emit the Withdraw event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// redeem execution, and are accounted for during redeem.
+ /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
+ /// not having enough shares, etc).
+ ///
+ /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ /// Those methods should be performed separately.
+ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC6909.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC6909.sol
new file mode 100644
index 000000000..6e11cb460
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC6909.sol
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import {IERC165} from "./IERC165.sol";
+
+/// @dev Required interface of an ERC-6909 compliant contract, as defined in
+/// https://eips.ethereum.org/EIPS/eip-6909
+interface IERC6909 is IERC165 {
+ /// @dev Emitted when the allowance of a `spender` for an `owner` is set for a token of type `id`.
+ event Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount);
+
+ /// @dev Emitted when `owner` grants or revokes operator status for a `spender`.
+ event OperatorSet(address indexed owner, address indexed spender, bool approved);
+
+ /// @dev Emitted when `amount` tokens of type `id` are moved from `sender` to `receiver` initiated by `caller`.
+ event Transfer(
+ address caller, address indexed sender, address indexed receiver, uint256 indexed id, uint256 amount
+ );
+
+ ///@dev Returns the amount of tokens of type `id` owned by `owner`.
+ function balanceOf(address owner, uint256 id) external view returns (uint256);
+
+ /// @dev Returns the amount of tokens of type `id` that `spender` is allowed to spend on behalf of `owner`.
+ /// NOTE: Does not include operator allowances.
+ function allowance(address owner, address spender, uint256 id) external view returns (uint256);
+
+ /// @dev Returns true if `spender` is set as an operator for `owner`.
+ function isOperator(address owner, address spender) external view returns (bool);
+
+ /// @dev Sets an approval to `spender` for `amount` tokens of type `id` from the caller's tokens.
+ /// Must return true.
+ function approve(address spender, uint256 id, uint256 amount) external returns (bool);
+
+ /// @dev Grants or revokes unlimited transfer permission of any token id to `spender` for the caller's tokens.
+ /// Must return true.
+ function setOperator(address spender, bool approved) external returns (bool);
+
+ /// @dev Transfers `amount` of token type `id` from the caller's account to `receiver`.
+ /// Must return true.
+ function transfer(address receiver, uint256 id, uint256 amount) external returns (bool);
+
+ /// @dev Transfers `amount` of token type `id` from `sender` to `receiver`.
+ /// Must return true.
+ function transferFrom(address sender, address receiver, uint256 id, uint256 amount) external returns (bool);
+}
+
+/// @dev Optional extension of {IERC6909} that adds metadata functions.
+interface IERC6909Metadata is IERC6909 {
+ /// @dev Returns the name of the token of type `id`.
+ function name(uint256 id) external view returns (string memory);
+
+ /// @dev Returns the ticker symbol of the token of type `id`.
+ function symbol(uint256 id) external view returns (string memory);
+
+ /// @dev Returns the number of decimals for the token of type `id`.
+ function decimals(uint256 id) external view returns (uint8);
+}
+
+/// @dev Optional extension of {IERC6909} that adds content URI functions.
+interface IERC6909ContentURI is IERC6909 {
+ /// @dev Returns URI for the contract.
+ function contractURI() external view returns (string memory);
+
+ /// @dev Returns the URI for the token of type `id`.
+ function tokenURI(uint256 id) external view returns (string memory);
+}
+
+/// @dev Optional extension of {IERC6909} that adds a token supply function.
+interface IERC6909TokenSupply is IERC6909 {
+ /// @dev Returns the total supply of the token of type `id`.
+ function totalSupply(uint256 id) external view returns (uint256);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC721.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC721.sol
new file mode 100644
index 000000000..21a4a94de
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC721.sol
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import {IERC165} from "./IERC165.sol";
+
+/// @title ERC-721 Non-Fungible Token Standard
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.
+interface IERC721 is IERC165 {
+ /// @dev This emits when ownership of any NFT changes by any mechanism.
+ /// This event emits when NFTs are created (`from` == 0) and destroyed
+ /// (`to` == 0). Exception: during contract creation, any number of NFTs
+ /// may be created and assigned without emitting Transfer. At the time of
+ /// any transfer, the approved address for that NFT (if any) is reset to none.
+ event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
+
+ /// @dev This emits when the approved address for an NFT is changed or
+ /// reaffirmed. The zero address indicates there is no approved address.
+ /// When a Transfer event emits, this also indicates that the approved
+ /// address for that NFT (if any) is reset to none.
+ event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
+
+ /// @dev This emits when an operator is enabled or disabled for an owner.
+ /// The operator can manage all NFTs of the owner.
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+
+ /// @notice Count all NFTs assigned to an owner
+ /// @dev NFTs assigned to the zero address are considered invalid, and this
+ /// function throws for queries about the zero address.
+ /// @param _owner An address for whom to query the balance
+ /// @return The number of NFTs owned by `_owner`, possibly zero
+ function balanceOf(address _owner) external view returns (uint256);
+
+ /// @notice Find the owner of an NFT
+ /// @dev NFTs assigned to zero address are considered invalid, and queries
+ /// about them do throw.
+ /// @param _tokenId The identifier for an NFT
+ /// @return The address of the owner of the NFT
+ function ownerOf(uint256 _tokenId) external view returns (address);
+
+ /// @notice Transfers the ownership of an NFT from one address to another address
+ /// @dev Throws unless `msg.sender` is the current owner, an authorized
+ /// operator, or the approved address for this NFT. Throws if `_from` is
+ /// not the current owner. Throws if `_to` is the zero address. Throws if
+ /// `_tokenId` is not a valid NFT. When transfer is complete, this function
+ /// checks if `_to` is a smart contract (code size > 0). If so, it calls
+ /// `onERC721Received` on `_to` and throws if the return value is not
+ /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ /// @param data Additional data with no specified format, sent in call to `_to`
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
+
+ /// @notice Transfers the ownership of an NFT from one address to another address
+ /// @dev This works identically to the other function with an extra data parameter,
+ /// except this function just sets data to "".
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
+
+ /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+ /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+ /// THEY MAY BE PERMANENTLY LOST
+ /// @dev Throws unless `msg.sender` is the current owner, an authorized
+ /// operator, or the approved address for this NFT. Throws if `_from` is
+ /// not the current owner. Throws if `_to` is the zero address. Throws if
+ /// `_tokenId` is not a valid NFT.
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
+
+ /// @notice Change or reaffirm the approved address for an NFT
+ /// @dev The zero address indicates there is no approved address.
+ /// Throws unless `msg.sender` is the current NFT owner, or an authorized
+ /// operator of the current owner.
+ /// @param _approved The new approved NFT controller
+ /// @param _tokenId The NFT to approve
+ function approve(address _approved, uint256 _tokenId) external payable;
+
+ /// @notice Enable or disable approval for a third party ("operator") to manage
+ /// all of `msg.sender`'s assets
+ /// @dev Emits the ApprovalForAll event. The contract MUST allow
+ /// multiple operators per owner.
+ /// @param _operator Address to add to the set of authorized operators
+ /// @param _approved True if the operator is approved, false to revoke approval
+ function setApprovalForAll(address _operator, bool _approved) external;
+
+ /// @notice Get the approved address for a single NFT
+ /// @dev Throws if `_tokenId` is not a valid NFT.
+ /// @param _tokenId The NFT to find the approved address for
+ /// @return The approved address for this NFT, or the zero address if there is none
+ function getApproved(uint256 _tokenId) external view returns (address);
+
+ /// @notice Query if an address is an authorized operator for another address
+ /// @param _owner The address that owns the NFTs
+ /// @param _operator The address that acts on behalf of the owner
+ /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+}
+
+/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
+interface IERC721TokenReceiver {
+ /// @notice Handle the receipt of an NFT
+ /// @dev The ERC721 smart contract calls this function on the recipient
+ /// after a `transfer`. This function MAY throw to revert and reject the
+ /// transfer. Return of other than the magic value MUST result in the
+ /// transaction being reverted.
+ /// Note: the contract address is always the message sender.
+ /// @param _operator The address which called `safeTransferFrom` function
+ /// @param _from The address which previously owned the token
+ /// @param _tokenId The NFT identifier which is being transferred
+ /// @param _data Additional data with no specified format
+ /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
+ /// unless throwing
+ function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)
+ external
+ returns (bytes4);
+}
+
+/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.
+interface IERC721Metadata is IERC721 {
+ /// @notice A descriptive name for a collection of NFTs in this contract
+ function name() external view returns (string memory _name);
+
+ /// @notice An abbreviated name for NFTs in this contract
+ function symbol() external view returns (string memory _symbol);
+
+ /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+ /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
+ /// 3986. The URI may point to a JSON file that conforms to the "ERC721
+ /// Metadata JSON Schema".
+ function tokenURI(uint256 _tokenId) external view returns (string memory);
+}
+
+/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x780e9d63.
+interface IERC721Enumerable is IERC721 {
+ /// @notice Count NFTs tracked by this contract
+ /// @return A count of valid NFTs tracked by this contract, where each one of
+ /// them has an assigned and queryable owner not equal to the zero address
+ function totalSupply() external view returns (uint256);
+
+ /// @notice Enumerate valid NFTs
+ /// @dev Throws if `_index` >= `totalSupply()`.
+ /// @param _index A counter less than `totalSupply()`
+ /// @return The token identifier for the `_index`th NFT,
+ /// (sort order not specified)
+ function tokenByIndex(uint256 _index) external view returns (uint256);
+
+ /// @notice Enumerate NFTs assigned to an owner
+ /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
+ /// `_owner` is the zero address, representing invalid NFTs.
+ /// @param _owner An address where we are interested in NFTs owned by them
+ /// @param _index A counter less than `balanceOf(_owner)`
+ /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
+ /// (sort order not specified)
+ function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC7540.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC7540.sol
new file mode 100644
index 000000000..91a38ca35
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC7540.sol
@@ -0,0 +1,150 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import {IERC7575} from "./IERC7575.sol";
+
+/// @dev Interface of the base operator logic of ERC7540, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7540
+interface IERC7540Operator {
+ /**
+ * @dev The event emitted when an operator is set.
+ *
+ * @param controller The address of the controller.
+ * @param operator The address of the operator.
+ * @param approved The approval status.
+ */
+ event OperatorSet(address indexed controller, address indexed operator, bool approved);
+
+ /**
+ * @dev Sets or removes an operator for the caller.
+ *
+ * @param operator The address of the operator.
+ * @param approved The approval status.
+ * @return Whether the call was executed successfully or not
+ */
+ function setOperator(address operator, bool approved) external returns (bool);
+
+ /**
+ * @dev Returns `true` if the `operator` is approved as an operator for an `controller`.
+ *
+ * @param controller The address of the controller.
+ * @param operator The address of the operator.
+ * @return status The approval status
+ */
+ function isOperator(address controller, address operator) external view returns (bool status);
+}
+
+/// @dev Interface of the asynchronous deposit Vault interface of ERC7540, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7540
+interface IERC7540Deposit is IERC7540Operator {
+ event DepositRequest(
+ address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets
+ );
+ /**
+ * @dev Transfers assets from sender into the Vault and submits a Request for asynchronous deposit.
+ *
+ * - MUST support ERC-20 approve / transferFrom on asset as a deposit Request flow.
+ * - MUST revert if all of assets cannot be requested for deposit.
+ * - owner MUST be msg.sender unless some unspecified explicit approval is given by the caller,
+ * approval of ERC-20 tokens from owner to sender is NOT enough.
+ *
+ * @param assets the amount of deposit assets to transfer from owner
+ * @param controller the controller of the request who will be able to operate the request
+ * @param owner the source of the deposit assets
+ *
+ * NOTE: most implementations will require pre-approval of the Vault with the Vault's underlying asset token.
+ */
+
+ function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId);
+
+ /**
+ * @dev Returns the amount of requested assets in Pending state.
+ *
+ * - MUST NOT include any assets in Claimable state for deposit or mint.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
+ */
+ function pendingDepositRequest(uint256 requestId, address controller)
+ external
+ view
+ returns (uint256 pendingAssets);
+
+ /**
+ * @dev Returns the amount of requested assets in Claimable state for the controller to deposit or mint.
+ *
+ * - MUST NOT include any assets in Pending state.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
+ */
+ function claimableDepositRequest(uint256 requestId, address controller)
+ external
+ view
+ returns (uint256 claimableAssets);
+
+ /**
+ * @dev Mints shares Vault shares to receiver by claiming the Request of the controller.
+ *
+ * - MUST emit the Deposit event.
+ * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator.
+ */
+ function deposit(uint256 assets, address receiver, address controller) external returns (uint256 shares);
+
+ /**
+ * @dev Mints exactly shares Vault shares to receiver by claiming the Request of the controller.
+ *
+ * - MUST emit the Deposit event.
+ * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator.
+ */
+ function mint(uint256 shares, address receiver, address controller) external returns (uint256 assets);
+}
+
+/// @dev Interface of the asynchronous deposit Vault interface of ERC7540, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7540
+interface IERC7540Redeem is IERC7540Operator {
+ event RedeemRequest(
+ address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets
+ );
+
+ /**
+ * @dev Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem.
+ *
+ * - MUST support a redeem Request flow where the control of shares is taken from sender directly
+ * where msg.sender has ERC-20 approval over the shares of owner.
+ * - MUST revert if all of shares cannot be requested for redeem.
+ *
+ * @param shares the amount of shares to be redeemed to transfer from owner
+ * @param controller the controller of the request who will be able to operate the request
+ * @param owner the source of the shares to be redeemed
+ *
+ * NOTE: most implementations will require pre-approval of the Vault with the Vault's share token.
+ */
+ function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId);
+
+ /**
+ * @dev Returns the amount of requested shares in Pending state.
+ *
+ * - MUST NOT include any shares in Claimable state for redeem or withdraw.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
+ */
+ function pendingRedeemRequest(uint256 requestId, address controller)
+ external
+ view
+ returns (uint256 pendingShares);
+
+ /**
+ * @dev Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw.
+ *
+ * - MUST NOT include any shares in Pending state for redeem or withdraw.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
+ */
+ function claimableRedeemRequest(uint256 requestId, address controller)
+ external
+ view
+ returns (uint256 claimableShares);
+}
+
+/// @dev Interface of the fully asynchronous Vault interface of ERC7540, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7540
+interface IERC7540 is IERC7540Deposit, IERC7540Redeem, IERC7575 {}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC7575.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC7575.sol
new file mode 100644
index 000000000..207e3e7fe
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC7575.sol
@@ -0,0 +1,241 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import {IERC165} from "./IERC165.sol";
+
+/// @dev Interface of the ERC7575 "Multi-Asset ERC-4626 Vaults", as defined in
+/// https://eips.ethereum.org/EIPS/eip-7575
+interface IERC7575 is IERC165 {
+ event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
+ event Withdraw(
+ address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
+ );
+
+ /**
+ * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
+ *
+ * - MUST be an ERC-20 token contract.
+ * - MUST NOT revert.
+ */
+ function asset() external view returns (address assetTokenAddress);
+
+ /**
+ * @dev Returns the address of the share token
+ *
+ * - MUST be an ERC-20 token contract.
+ * - MUST NOT revert.
+ */
+ function share() external view returns (address shareTokenAddress);
+
+ /**
+ * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal
+ * scenario where all the conditions are met.
+ *
+ * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ * - MUST NOT revert.
+ *
+ * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ * from.
+ */
+ function convertToShares(uint256 assets) external view returns (uint256 shares);
+
+ /**
+ * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal
+ * scenario where all the conditions are met.
+ *
+ * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ * - MUST NOT show any variations depending on the caller.
+ * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ * - MUST NOT revert.
+ *
+ * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ * from.
+ */
+ function convertToAssets(uint256 shares) external view returns (uint256 assets);
+
+ /**
+ * @dev Returns the total amount of the underlying asset that is “managed” by Vault.
+ *
+ * - SHOULD include any compounding that occurs from yield.
+ * - MUST be inclusive of any fees that are charged against assets in the Vault.
+ * - MUST NOT revert.
+ */
+ function totalAssets() external view returns (uint256 totalManagedAssets);
+
+ /**
+ * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
+ * through a deposit call.
+ *
+ * - MUST return a limited value if receiver is subject to some deposit limit.
+ * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
+ * - MUST NOT revert.
+ */
+ function maxDeposit(address receiver) external view returns (uint256 maxAssets);
+
+ /**
+ * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
+ * current on-chain conditions.
+ *
+ * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
+ * call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
+ * in the same transaction.
+ * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
+ * deposit would be accepted, regardless if the user has enough tokens approved, etc.
+ * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ * - MUST NOT revert.
+ *
+ * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
+ * share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ */
+ function previewDeposit(uint256 assets) external view returns (uint256 shares);
+
+ /**
+ * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
+ *
+ * - MUST emit the Deposit event.
+ * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ * deposit execution, and are accounted for during deposit.
+ * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
+ * approving enough underlying tokens to the Vault contract, etc).
+ *
+ * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ */
+ function deposit(uint256 assets, address receiver) external returns (uint256 shares);
+
+ /**
+ * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
+ * - MUST return a limited value if receiver is subject to some mint limit.
+ * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
+ * - MUST NOT revert.
+ */
+ function maxMint(address receiver) external view returns (uint256 maxShares);
+
+ /**
+ * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
+ * current on-chain conditions.
+ *
+ * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
+ * in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
+ * same transaction.
+ * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
+ * would be accepted, regardless if the user has enough tokens approved, etc.
+ * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ * - MUST NOT revert.
+ *
+ * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
+ * share price or some other type of condition, meaning the depositor will lose assets by minting.
+ */
+ function previewMint(uint256 shares) external view returns (uint256 assets);
+
+ /**
+ * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
+ *
+ * - MUST emit the Deposit event.
+ * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
+ * execution, and are accounted for during mint.
+ * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
+ * approving enough underlying tokens to the Vault contract, etc).
+ *
+ * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ */
+ function mint(uint256 shares, address receiver) external returns (uint256 assets);
+
+ /**
+ * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
+ * Vault, through a withdraw call.
+ *
+ * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ * - MUST NOT revert.
+ */
+ function maxWithdraw(address owner) external view returns (uint256 maxAssets);
+
+ /**
+ * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
+ * given current on-chain conditions.
+ *
+ * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
+ * call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
+ * called
+ * in the same transaction.
+ * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
+ * the withdrawal would be accepted, regardless if the user has enough shares, etc.
+ * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ * - MUST NOT revert.
+ *
+ * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
+ * share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ */
+ function previewWithdraw(uint256 assets) external view returns (uint256 shares);
+
+ /**
+ * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.
+ *
+ * - MUST emit the Withdraw event.
+ * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ * withdraw execution, and are accounted for during withdraw.
+ * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
+ * not having enough shares, etc).
+ *
+ * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ * Those methods should be performed separately.
+ */
+ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
+
+ /**
+ * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
+ * through a redeem call.
+ *
+ * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
+ * - MUST NOT revert.
+ */
+ function maxRedeem(address owner) external view returns (uint256 maxShares);
+
+ /**
+ * @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
+ * given current on-chain conditions.
+ *
+ * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
+ * in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
+ * same transaction.
+ * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
+ * redemption would be accepted, regardless if the user has enough shares, etc.
+ * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ * - MUST NOT revert.
+ *
+ * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
+ * share price or some other type of condition, meaning the depositor will lose assets by redeeming.
+ */
+ function previewRedeem(uint256 shares) external view returns (uint256 assets);
+
+ /**
+ * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.
+ *
+ * - MUST emit the Withdraw event.
+ * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ * redeem execution, and are accounted for during redeem.
+ * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
+ * not having enough shares, etc).
+ *
+ * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ * Those methods should be performed separately.
+ */
+ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
+}
+
+/// @dev Interface of the ERC20 share token, as defined in
+/// https://eips.ethereum.org/EIPS/eip-7575
+interface IERC7575Share is IERC165 {
+ event VaultUpdate(address indexed asset, address vault);
+
+ /**
+ * @dev Returns the address of the Vault for the given asset.
+ *
+ * @param asset the ERC-20 token to deposit with into the Vault
+ */
+ function vault(address asset) external view returns (address);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IMulticall3.sol b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IMulticall3.sol
new file mode 100644
index 000000000..0d031b71d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/interfaces/IMulticall3.sol
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+interface IMulticall3 {
+ struct Call {
+ address target;
+ bytes callData;
+ }
+
+ struct Call3 {
+ address target;
+ bool allowFailure;
+ bytes callData;
+ }
+
+ struct Call3Value {
+ address target;
+ bool allowFailure;
+ uint256 value;
+ bytes callData;
+ }
+
+ struct Result {
+ bool success;
+ bytes returnData;
+ }
+
+ function aggregate(Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes[] memory returnData);
+
+ function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);
+
+ function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);
+
+ function blockAndAggregate(Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);
+
+ function getBasefee() external view returns (uint256 basefee);
+
+ function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);
+
+ function getBlockNumber() external view returns (uint256 blockNumber);
+
+ function getChainId() external view returns (uint256 chainid);
+
+ function getCurrentBlockCoinbase() external view returns (address coinbase);
+
+ function getCurrentBlockDifficulty() external view returns (uint256 difficulty);
+
+ function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);
+
+ function getCurrentBlockTimestamp() external view returns (uint256 timestamp);
+
+ function getEthBalance(address addr) external view returns (uint256 balance);
+
+ function getLastBlockHash() external view returns (bytes32 blockHash);
+
+ function tryAggregate(bool requireSuccess, Call[] calldata calls)
+ external
+ payable
+ returns (Result[] memory returnData);
+
+ function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/src/safeconsole.sol b/lib/signals-implicit-mode/lib/forge-std/src/safeconsole.sol
new file mode 100644
index 000000000..87c475a5b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/src/safeconsole.sol
@@ -0,0 +1,13937 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+/// @author philogy
+/// @dev Code generated automatically by script.
+library safeconsole {
+ uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;
+
+ // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)
+ // for the view-to-pure log trick.
+ function _sendLogPayload(uint256 offset, uint256 size) private pure {
+ function(uint256, uint256) internal view fnIn = _sendLogPayloadView;
+ function(uint256, uint256) internal pure pureSendLogPayload;
+ /// @solidity memory-safe-assembly
+ assembly {
+ pureSendLogPayload := fnIn
+ }
+ pureSendLogPayload(offset, size);
+ }
+
+ function _sendLogPayloadView(uint256 offset, uint256 size) private view {
+ /// @solidity memory-safe-assembly
+ assembly {
+ pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))
+ }
+ }
+
+ function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {
+ function(uint256, uint256, uint256) internal view fnIn = _memcopyView;
+ function(uint256, uint256, uint256) internal pure pureMemcopy;
+ /// @solidity memory-safe-assembly
+ assembly {
+ pureMemcopy := fnIn
+ }
+ pureMemcopy(fromOffset, toOffset, length);
+ }
+
+ function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {
+ /// @solidity memory-safe-assembly
+ assembly {
+ pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))
+ }
+ }
+
+ function logMemory(uint256 offset, uint256 length) internal pure {
+ if (offset >= 0x60) {
+ // Sufficient memory before slice to prepare call header.
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(sub(offset, 0x60))
+ m1 := mload(sub(offset, 0x40))
+ m2 := mload(sub(offset, 0x20))
+ // Selector of `log(bytes)`.
+ mstore(sub(offset, 0x60), 0x0be77f56)
+ mstore(sub(offset, 0x40), 0x20)
+ mstore(sub(offset, 0x20), length)
+ }
+ _sendLogPayload(offset - 0x44, length + 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(sub(offset, 0x60), m0)
+ mstore(sub(offset, 0x40), m1)
+ mstore(sub(offset, 0x20), m2)
+ }
+ } else {
+ // Insufficient space, so copy slice forward, add header and reverse.
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ uint256 endOffset = offset + length;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(add(endOffset, 0x00))
+ m1 := mload(add(endOffset, 0x20))
+ m2 := mload(add(endOffset, 0x40))
+ }
+ _memcopy(offset, offset + 0x60, length);
+ /// @solidity memory-safe-assembly
+ assembly {
+ // Selector of `log(bytes)`.
+ mstore(add(offset, 0x00), 0x0be77f56)
+ mstore(add(offset, 0x20), 0x20)
+ mstore(add(offset, 0x40), length)
+ }
+ _sendLogPayload(offset + 0x1c, length + 0x44);
+ _memcopy(offset + 0x60, offset, length);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(add(endOffset, 0x00), m0)
+ mstore(add(endOffset, 0x20), m1)
+ mstore(add(endOffset, 0x40), m2)
+ }
+ }
+ }
+
+ function log(address p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(address)`.
+ mstore(0x00, 0x2c2ecbc2)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(bool p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(bool)`.
+ mstore(0x00, 0x32458eed)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(uint256 p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(uint256)`.
+ mstore(0x00, 0xf82c50f1)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(bytes32 p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(string)`.
+ mstore(0x00, 0x41304fac)
+ mstore(0x20, 0x20)
+ writeString(0x40, p0)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,address)`.
+ mstore(0x00, 0xdaf0d4aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,bool)`.
+ mstore(0x00, 0x75b605d3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,uint256)`.
+ mstore(0x00, 0x8309e8a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,string)`.
+ mstore(0x00, 0x759f86bb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,address)`.
+ mstore(0x00, 0x853c4849)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,bool)`.
+ mstore(0x00, 0x2a110e83)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,uint256)`.
+ mstore(0x00, 0x399174d3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,string)`.
+ mstore(0x00, 0x8feac525)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,address)`.
+ mstore(0x00, 0x69276c86)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,bool)`.
+ mstore(0x00, 0x1c9d7eb3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,uint256)`.
+ mstore(0x00, 0xf666715a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,string)`.
+ mstore(0x00, 0x643fd0df)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,address)`.
+ mstore(0x00, 0x319af333)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,bool)`.
+ mstore(0x00, 0xc3b55635)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,uint256)`.
+ mstore(0x00, 0xb60e72cc)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,string)`.
+ mstore(0x00, 0x4b5c4277)
+ mstore(0x20, 0x40)
+ mstore(0x40, 0x80)
+ writeString(0x60, p0)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,address)`.
+ mstore(0x00, 0x018c84c2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,bool)`.
+ mstore(0x00, 0xf2a66286)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,uint256)`.
+ mstore(0x00, 0x17fe6185)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,address,string)`.
+ mstore(0x00, 0x007150be)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,address)`.
+ mstore(0x00, 0xf11699ed)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,bool)`.
+ mstore(0x00, 0xeb830c92)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,uint256)`.
+ mstore(0x00, 0x9c4f99fb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,bool,string)`.
+ mstore(0x00, 0x212255cc)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,address)`.
+ mstore(0x00, 0x7bc0d848)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,bool)`.
+ mstore(0x00, 0x678209a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,uint256)`.
+ mstore(0x00, 0xb69bcaf6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,uint256,string)`.
+ mstore(0x00, 0xa1f2e8aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,address)`.
+ mstore(0x00, 0xf08744e8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,bool)`.
+ mstore(0x00, 0xcf020fb1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,uint256)`.
+ mstore(0x00, 0x67dd6ff1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(address,string,string)`.
+ mstore(0x00, 0xfb772265)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bool p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,address)`.
+ mstore(0x00, 0xd2763667)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,bool)`.
+ mstore(0x00, 0x18c9c746)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,uint256)`.
+ mstore(0x00, 0x5f7b9afb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,address,string)`.
+ mstore(0x00, 0xde9a9270)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,address)`.
+ mstore(0x00, 0x1078f68d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,bool)`.
+ mstore(0x00, 0x50709698)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,uint256)`.
+ mstore(0x00, 0x12f21602)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,bool,string)`.
+ mstore(0x00, 0x2555fa46)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,address)`.
+ mstore(0x00, 0x088ef9d2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,bool)`.
+ mstore(0x00, 0xe8defba9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,uint256)`.
+ mstore(0x00, 0x37103367)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,uint256,string)`.
+ mstore(0x00, 0xc3fc3970)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,address)`.
+ mstore(0x00, 0x9591b953)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,bool)`.
+ mstore(0x00, 0xdbb4c247)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,uint256)`.
+ mstore(0x00, 0x1093ee11)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(bool,string,string)`.
+ mstore(0x00, 0xb076847f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,address)`.
+ mstore(0x00, 0xbcfd9be0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,bool)`.
+ mstore(0x00, 0x9b6ec042)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,uint256)`.
+ mstore(0x00, 0x5a9b5ed5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,address,string)`.
+ mstore(0x00, 0x63cb41f9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,address)`.
+ mstore(0x00, 0x35085f7b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,bool)`.
+ mstore(0x00, 0x20718650)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,uint256)`.
+ mstore(0x00, 0x20098014)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,bool,string)`.
+ mstore(0x00, 0x85775021)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,address)`.
+ mstore(0x00, 0x5c96b331)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,bool)`.
+ mstore(0x00, 0x4766da72)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,uint256)`.
+ mstore(0x00, 0xd1ed7a3c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,uint256,string)`.
+ mstore(0x00, 0x71d04af2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,address)`.
+ mstore(0x00, 0x7afac959)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,bool)`.
+ mstore(0x00, 0x4ceda75a)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,uint256)`.
+ mstore(0x00, 0x37aa7d4c)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(uint256,string,string)`.
+ mstore(0x00, 0xb115611f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,address)`.
+ mstore(0x00, 0xfcec75e0)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,bool)`.
+ mstore(0x00, 0xc91d5ed4)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,uint256)`.
+ mstore(0x00, 0x0d26b925)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,address,string)`.
+ mstore(0x00, 0xe0e9ad4f)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,address)`.
+ mstore(0x00, 0x932bbb38)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,bool)`.
+ mstore(0x00, 0x850b7ad6)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,uint256)`.
+ mstore(0x00, 0xc95958d6)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,bool,string)`.
+ mstore(0x00, 0xe298f47d)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,address)`.
+ mstore(0x00, 0x1c7ec448)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,bool)`.
+ mstore(0x00, 0xca7733b1)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,uint256)`.
+ mstore(0x00, 0xca47c4eb)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,uint256,string)`.
+ mstore(0x00, 0x5970e089)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,address)`.
+ mstore(0x00, 0x95ed0195)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,bool)`.
+ mstore(0x00, 0xb0e0f9b5)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,uint256)`.
+ mstore(0x00, 0x5821efa1)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ // Selector of `log(string,string,string)`.
+ mstore(0x00, 0x2ced7cef)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, 0xe0)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ writeString(0x100, p2)
+ }
+ _sendLogPayload(0x1c, 0x124);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ }
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,address)`.
+ mstore(0x00, 0x665bf134)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,bool)`.
+ mstore(0x00, 0x0e378994)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,uint256)`.
+ mstore(0x00, 0x94250d77)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,address,string)`.
+ mstore(0x00, 0xf808da20)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,address)`.
+ mstore(0x00, 0x9f1bc36e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,bool)`.
+ mstore(0x00, 0x2cd4134a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,uint256)`.
+ mstore(0x00, 0x3971e78c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,bool,string)`.
+ mstore(0x00, 0xaa6540c8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,address)`.
+ mstore(0x00, 0x8da6def5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,bool)`.
+ mstore(0x00, 0x9b4254e2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,uint256)`.
+ mstore(0x00, 0xbe553481)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,uint256,string)`.
+ mstore(0x00, 0xfdb4f990)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,address)`.
+ mstore(0x00, 0x8f736d16)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,bool)`.
+ mstore(0x00, 0x6f1a594e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,uint256)`.
+ mstore(0x00, 0xef1cefe7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,address,string,string)`.
+ mstore(0x00, 0x21bdaf25)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,address)`.
+ mstore(0x00, 0x660375dd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,bool)`.
+ mstore(0x00, 0xa6f50b0f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,uint256)`.
+ mstore(0x00, 0xa75c59de)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,address,string)`.
+ mstore(0x00, 0x2dd778e6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,address)`.
+ mstore(0x00, 0xcf394485)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,bool)`.
+ mstore(0x00, 0xcac43479)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,uint256)`.
+ mstore(0x00, 0x8c4e5de6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,bool,string)`.
+ mstore(0x00, 0xdfc4a2e8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,address)`.
+ mstore(0x00, 0xccf790a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,bool)`.
+ mstore(0x00, 0xc4643e20)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,uint256)`.
+ mstore(0x00, 0x386ff5f4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,uint256,string)`.
+ mstore(0x00, 0x0aa6cfad)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,address)`.
+ mstore(0x00, 0x19fd4956)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,bool)`.
+ mstore(0x00, 0x50ad461d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,uint256)`.
+ mstore(0x00, 0x80e6a20b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,bool,string,string)`.
+ mstore(0x00, 0x475c5c33)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,address)`.
+ mstore(0x00, 0x478d1c62)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,bool)`.
+ mstore(0x00, 0xa1bcc9b3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,uint256)`.
+ mstore(0x00, 0x100f650e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,address,string)`.
+ mstore(0x00, 0x1da986ea)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,address)`.
+ mstore(0x00, 0xa31bfdcc)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,bool)`.
+ mstore(0x00, 0x3bf5e537)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,uint256)`.
+ mstore(0x00, 0x22f6b999)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,bool,string)`.
+ mstore(0x00, 0xc5ad85f9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,address)`.
+ mstore(0x00, 0x20e3984d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,bool)`.
+ mstore(0x00, 0x66f1bc67)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,uint256)`.
+ mstore(0x00, 0x34f0e636)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,uint256,string)`.
+ mstore(0x00, 0x4a28c017)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,address)`.
+ mstore(0x00, 0x5c430d47)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,bool)`.
+ mstore(0x00, 0xcf18105c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,uint256)`.
+ mstore(0x00, 0xbf01f891)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,uint256,string,string)`.
+ mstore(0x00, 0x88a8c406)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,address)`.
+ mstore(0x00, 0x0d36fa20)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,bool)`.
+ mstore(0x00, 0x0df12b76)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,uint256)`.
+ mstore(0x00, 0x457fe3cf)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,address,string)`.
+ mstore(0x00, 0xf7e36245)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,address)`.
+ mstore(0x00, 0x205871c2)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,bool)`.
+ mstore(0x00, 0x5f1d5c9f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,uint256)`.
+ mstore(0x00, 0x515e38b6)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,bool,string)`.
+ mstore(0x00, 0xbc0b61fe)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,address)`.
+ mstore(0x00, 0x63183678)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,bool)`.
+ mstore(0x00, 0x0ef7e050)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,uint256)`.
+ mstore(0x00, 0x1dc8e1b8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,uint256,string)`.
+ mstore(0x00, 0x448830a8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,address)`.
+ mstore(0x00, 0xa04e2f87)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,bool)`.
+ mstore(0x00, 0x35a5071f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,uint256)`.
+ mstore(0x00, 0x159f8927)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(address,string,string,string)`.
+ mstore(0x00, 0x5d02c50b)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,address)`.
+ mstore(0x00, 0x1d14d001)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,bool)`.
+ mstore(0x00, 0x46600be0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,uint256)`.
+ mstore(0x00, 0x0c66d1be)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,address,string)`.
+ mstore(0x00, 0xd812a167)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,address)`.
+ mstore(0x00, 0x1c41a336)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,bool)`.
+ mstore(0x00, 0x6a9c478b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,uint256)`.
+ mstore(0x00, 0x07831502)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,bool,string)`.
+ mstore(0x00, 0x4a66cb34)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,address)`.
+ mstore(0x00, 0x136b05dd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,bool)`.
+ mstore(0x00, 0xd6019f1c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,uint256)`.
+ mstore(0x00, 0x7bf181a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,uint256,string)`.
+ mstore(0x00, 0x51f09ff8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,address)`.
+ mstore(0x00, 0x6f7c603e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,bool)`.
+ mstore(0x00, 0xe2bfd60b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,uint256)`.
+ mstore(0x00, 0xc21f64c7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,address,string,string)`.
+ mstore(0x00, 0xa73c1db6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,address)`.
+ mstore(0x00, 0xf4880ea4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,bool)`.
+ mstore(0x00, 0xc0a302d8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,uint256)`.
+ mstore(0x00, 0x4c123d57)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,address,string)`.
+ mstore(0x00, 0xa0a47963)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,address)`.
+ mstore(0x00, 0x8c329b1a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,bool)`.
+ mstore(0x00, 0x3b2a5ce0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,uint256)`.
+ mstore(0x00, 0x6d7045c1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,bool,string)`.
+ mstore(0x00, 0x2ae408d4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,address)`.
+ mstore(0x00, 0x54a7a9a0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,bool)`.
+ mstore(0x00, 0x619e4d0e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,uint256)`.
+ mstore(0x00, 0x0bb00eab)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,uint256,string)`.
+ mstore(0x00, 0x7dd4d0e0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,address)`.
+ mstore(0x00, 0xf9ad2b89)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,bool)`.
+ mstore(0x00, 0xb857163a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,uint256)`.
+ mstore(0x00, 0xe3a9ca2f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,bool,string,string)`.
+ mstore(0x00, 0x6d1e8751)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,address)`.
+ mstore(0x00, 0x26f560a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,bool)`.
+ mstore(0x00, 0xb4c314ff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,uint256)`.
+ mstore(0x00, 0x1537dc87)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,address,string)`.
+ mstore(0x00, 0x1bb3b09a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,address)`.
+ mstore(0x00, 0x9acd3616)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,bool)`.
+ mstore(0x00, 0xceb5f4d7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,uint256)`.
+ mstore(0x00, 0x7f9bbca2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,bool,string)`.
+ mstore(0x00, 0x9143dbb1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,address)`.
+ mstore(0x00, 0x00dd87b9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,bool)`.
+ mstore(0x00, 0xbe984353)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,uint256)`.
+ mstore(0x00, 0x374bb4b2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,uint256,string)`.
+ mstore(0x00, 0x8e69fb5d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,address)`.
+ mstore(0x00, 0xfedd1fff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,bool)`.
+ mstore(0x00, 0xe5e70b2b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,uint256)`.
+ mstore(0x00, 0x6a1199e2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,uint256,string,string)`.
+ mstore(0x00, 0xf5bc2249)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,address)`.
+ mstore(0x00, 0x2b2b18dc)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,bool)`.
+ mstore(0x00, 0x6dd434ca)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,uint256)`.
+ mstore(0x00, 0xa5cada94)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,address,string)`.
+ mstore(0x00, 0x12d6c788)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,address)`.
+ mstore(0x00, 0x538e06ab)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,bool)`.
+ mstore(0x00, 0xdc5e935b)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,uint256)`.
+ mstore(0x00, 0x1606a393)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,bool,string)`.
+ mstore(0x00, 0x483d0416)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,address)`.
+ mstore(0x00, 0x1596a1ce)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,bool)`.
+ mstore(0x00, 0x6b0e5d53)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,uint256)`.
+ mstore(0x00, 0x28863fcb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,uint256,string)`.
+ mstore(0x00, 0x1ad96de6)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,address)`.
+ mstore(0x00, 0x97d394d8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,bool)`.
+ mstore(0x00, 0x1e4b87e5)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,uint256)`.
+ mstore(0x00, 0x7be0c3eb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(bool,string,string,string)`.
+ mstore(0x00, 0x1762e32a)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,address)`.
+ mstore(0x00, 0x2488b414)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,bool)`.
+ mstore(0x00, 0x091ffaf5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,uint256)`.
+ mstore(0x00, 0x736efbb6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,address,string)`.
+ mstore(0x00, 0x031c6f73)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,address)`.
+ mstore(0x00, 0xef72c513)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,bool)`.
+ mstore(0x00, 0xe351140f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,uint256)`.
+ mstore(0x00, 0x5abd992a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,bool,string)`.
+ mstore(0x00, 0x90fb06aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,address)`.
+ mstore(0x00, 0x15c127b5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,bool)`.
+ mstore(0x00, 0x5f743a7c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,uint256)`.
+ mstore(0x00, 0x0c9cd9c1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,uint256,string)`.
+ mstore(0x00, 0xddb06521)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,address)`.
+ mstore(0x00, 0x9cba8fff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,bool)`.
+ mstore(0x00, 0xcc32ab07)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,uint256)`.
+ mstore(0x00, 0x46826b5d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,address,string,string)`.
+ mstore(0x00, 0x3e128ca3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,address)`.
+ mstore(0x00, 0xa1ef4cbb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,bool)`.
+ mstore(0x00, 0x454d54a5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,uint256)`.
+ mstore(0x00, 0x078287f5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,address,string)`.
+ mstore(0x00, 0xade052c7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,address)`.
+ mstore(0x00, 0x69640b59)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,bool)`.
+ mstore(0x00, 0xb6f577a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,uint256)`.
+ mstore(0x00, 0x7464ce23)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,bool,string)`.
+ mstore(0x00, 0xdddb9561)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,address)`.
+ mstore(0x00, 0x88cb6041)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,bool)`.
+ mstore(0x00, 0x91a02e2a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,uint256)`.
+ mstore(0x00, 0xc6acc7a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,uint256,string)`.
+ mstore(0x00, 0xde03e774)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,address)`.
+ mstore(0x00, 0xef529018)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,bool)`.
+ mstore(0x00, 0xeb928d7f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,uint256)`.
+ mstore(0x00, 0x2c1d0746)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,bool,string,string)`.
+ mstore(0x00, 0x68c8b8bd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,address)`.
+ mstore(0x00, 0x56a5d1b1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,bool)`.
+ mstore(0x00, 0x15cac476)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,uint256)`.
+ mstore(0x00, 0x88f6e4b2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,address,string)`.
+ mstore(0x00, 0x6cde40b8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,address)`.
+ mstore(0x00, 0x9a816a83)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,bool)`.
+ mstore(0x00, 0xab085ae6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,uint256)`.
+ mstore(0x00, 0xeb7f6fd2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,bool,string)`.
+ mstore(0x00, 0xa5b4fc99)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,address)`.
+ mstore(0x00, 0xfa8185af)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,bool)`.
+ mstore(0x00, 0xc598d185)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,uint256)`.
+ mstore(0x00, 0x193fb800)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,uint256,string)`.
+ mstore(0x00, 0x59cfcbe3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,address)`.
+ mstore(0x00, 0x42d21db7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,bool)`.
+ mstore(0x00, 0x7af6ab25)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,uint256)`.
+ mstore(0x00, 0x5da297eb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,uint256,string,string)`.
+ mstore(0x00, 0x27d8afd2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,address)`.
+ mstore(0x00, 0x6168ed61)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,bool)`.
+ mstore(0x00, 0x90c30a56)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,uint256)`.
+ mstore(0x00, 0xe8d3018d)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,address,string)`.
+ mstore(0x00, 0x9c3adfa1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,address)`.
+ mstore(0x00, 0xae2ec581)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,bool)`.
+ mstore(0x00, 0xba535d9c)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,uint256)`.
+ mstore(0x00, 0xcf009880)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,bool,string)`.
+ mstore(0x00, 0xd2d423cd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,address)`.
+ mstore(0x00, 0x3b2279b4)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,bool)`.
+ mstore(0x00, 0x691a8f74)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,uint256)`.
+ mstore(0x00, 0x82c25b74)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,uint256,string)`.
+ mstore(0x00, 0xb7b914ca)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,address)`.
+ mstore(0x00, 0xd583c602)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,bool)`.
+ mstore(0x00, 0xb3a6b6bd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,uint256)`.
+ mstore(0x00, 0xb028c9bd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(uint256,string,string,string)`.
+ mstore(0x00, 0x21ad0683)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,address)`.
+ mstore(0x00, 0xed8f28f6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,bool)`.
+ mstore(0x00, 0xb59dbd60)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,uint256)`.
+ mstore(0x00, 0x8ef3f399)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,address,string)`.
+ mstore(0x00, 0x800a1c67)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,address)`.
+ mstore(0x00, 0x223603bd)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,bool)`.
+ mstore(0x00, 0x79884c2b)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,uint256)`.
+ mstore(0x00, 0x3e9f866a)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,bool,string)`.
+ mstore(0x00, 0x0454c079)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,address)`.
+ mstore(0x00, 0x63fb8bc5)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,bool)`.
+ mstore(0x00, 0xfc4845f0)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,uint256)`.
+ mstore(0x00, 0xf8f51b1e)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,uint256,string)`.
+ mstore(0x00, 0x5a477632)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,address)`.
+ mstore(0x00, 0xaabc9a31)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,bool)`.
+ mstore(0x00, 0x5f15d28c)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,uint256)`.
+ mstore(0x00, 0x91d1112e)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,address,string,string)`.
+ mstore(0x00, 0x245986f2)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,address)`.
+ mstore(0x00, 0x33e9dd1d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,bool)`.
+ mstore(0x00, 0x958c28c6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,uint256)`.
+ mstore(0x00, 0x5d08bb05)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,address,string)`.
+ mstore(0x00, 0x2d8e33a4)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,address)`.
+ mstore(0x00, 0x7190a529)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,bool)`.
+ mstore(0x00, 0x895af8c5)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,uint256)`.
+ mstore(0x00, 0x8e3f78a9)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,bool,string)`.
+ mstore(0x00, 0x9d22d5dd)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,address)`.
+ mstore(0x00, 0x935e09bf)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,bool)`.
+ mstore(0x00, 0x8af7cf8a)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,uint256)`.
+ mstore(0x00, 0x64b5bb67)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,uint256,string)`.
+ mstore(0x00, 0x742d6ee7)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,address)`.
+ mstore(0x00, 0xe0625b29)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,bool)`.
+ mstore(0x00, 0x3f8a701d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,uint256)`.
+ mstore(0x00, 0x24f91465)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,bool,string,string)`.
+ mstore(0x00, 0xa826caeb)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,address)`.
+ mstore(0x00, 0x5ea2b7ae)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,bool)`.
+ mstore(0x00, 0x82112a42)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,uint256)`.
+ mstore(0x00, 0x4f04fdc6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,address,string)`.
+ mstore(0x00, 0x9ffb2f93)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,address)`.
+ mstore(0x00, 0xe0e95b98)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,bool)`.
+ mstore(0x00, 0x354c36d6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,uint256)`.
+ mstore(0x00, 0xe41b6f6f)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,bool,string)`.
+ mstore(0x00, 0xabf73a98)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,address)`.
+ mstore(0x00, 0xe21de278)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,bool)`.
+ mstore(0x00, 0x7626db92)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,uint256)`.
+ mstore(0x00, 0xa7a87853)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,uint256,string)`.
+ mstore(0x00, 0x854b3496)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,address)`.
+ mstore(0x00, 0x7c4632a4)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,bool)`.
+ mstore(0x00, 0x7d24491d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,uint256)`.
+ mstore(0x00, 0xc67ea9d1)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,uint256,string,string)`.
+ mstore(0x00, 0x5ab84e1f)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,address)`.
+ mstore(0x00, 0x439c7bef)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,bool)`.
+ mstore(0x00, 0x5ccd4e37)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,uint256)`.
+ mstore(0x00, 0x7cc3c607)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,address,string)`.
+ mstore(0x00, 0xeb1bff80)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,address)`.
+ mstore(0x00, 0xc371c7db)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,bool)`.
+ mstore(0x00, 0x40785869)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,uint256)`.
+ mstore(0x00, 0xd6aefad2)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,bool,string)`.
+ mstore(0x00, 0x5e84b0ea)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,address)`.
+ mstore(0x00, 0x1023f7b2)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,bool)`.
+ mstore(0x00, 0xc3a8a654)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,uint256)`.
+ mstore(0x00, 0xf45d7d2c)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,uint256,string)`.
+ mstore(0x00, 0x5d1a971a)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,address)`.
+ mstore(0x00, 0x6d572f44)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,bool)`.
+ mstore(0x00, 0x2c1754ed)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,uint256)`.
+ mstore(0x00, 0x8eafb02b)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ bytes32 m11;
+ bytes32 m12;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ m11 := mload(0x160)
+ m12 := mload(0x180)
+ // Selector of `log(string,string,string,string)`.
+ mstore(0x00, 0xde68f20a)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, 0x140)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ writeString(0x160, p3)
+ }
+ _sendLogPayload(0x1c, 0x184);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ mstore(0x160, m11)
+ mstore(0x180, m12)
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/CommonBase.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/CommonBase.t.sol
new file mode 100644
index 000000000..4a6eb34fd
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/CommonBase.t.sol
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {CommonBase} from "../src/Base.sol";
+import {StdConstants} from "../src/StdConstants.sol";
+import {Test} from "../src/Test.sol";
+
+contract CommonBaseTest is Test {
+ function testVmAddressValue() public pure {
+ assertEq(VM_ADDRESS, address(StdConstants.VM));
+ }
+
+ function testConsoleValue() public pure {
+ assertEq(CONSOLE, StdConstants.CONSOLE);
+ }
+
+ function testCreate2FactoryValue() public pure {
+ assertEq(CREATE2_FACTORY, StdConstants.CREATE2_FACTORY);
+ }
+
+ function testDefaultSenderValue() public pure {
+ assertEq(DEFAULT_SENDER, StdConstants.DEFAULT_SENDER);
+ }
+
+ function testDefaultTestContractValue() public pure {
+ assertEq(DEFAULT_TEST_CONTRACT, StdConstants.DEFAULT_TEST_CONTRACT);
+ }
+
+ function testMulticall3AddressValue() public pure {
+ assertEq(MULTICALL3_ADDRESS, address(StdConstants.MULTICALL3_ADDRESS));
+ }
+
+ function testSecp256k1OrderValue() public pure {
+ assertEq(SECP256K1_ORDER, StdConstants.SECP256K1_ORDER);
+ }
+
+ function testUint256MaxValue() public pure {
+ assertEq(UINT256_MAX, type(uint256).max);
+ }
+
+ function testVmValue() public pure {
+ assertEq(address(vm), address(StdConstants.VM));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/Config.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/Config.t.sol
new file mode 100644
index 000000000..8e2342cad
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/Config.t.sol
@@ -0,0 +1,352 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.13;
+
+import {Test} from "../src/Test.sol";
+import {Config} from "../src/Config.sol";
+import {StdConfig} from "../src/StdConfig.sol";
+
+contract ConfigTest is Test, Config {
+ function setUp() public {
+ vm.setEnv("MAINNET_RPC", "https://eth.llamarpc.com");
+ vm.setEnv("WETH_MAINNET", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");
+ vm.setEnv("OPTIMISM_RPC", "https://mainnet.optimism.io");
+ vm.setEnv("WETH_OPTIMISM", "0x4200000000000000000000000000000000000006");
+ }
+
+ function test_loadConfig() public {
+ // Deploy the config contract with the test fixture.
+ _loadConfig("./test/fixtures/config.toml", false);
+
+ // -- MAINNET --------------------------------------------------------------
+
+ // Read and assert RPC URL for Mainnet (chain ID 1)
+ assertEq(config.getRpcUrl(1), "https://eth.llamarpc.com");
+
+ // Read and assert boolean values
+ assertTrue(config.get(1, "is_live").toBool());
+ bool[] memory bool_array = config.get(1, "bool_array").toBoolArray();
+ assertTrue(bool_array[0]);
+ assertFalse(bool_array[1]);
+
+ // Read and assert address values
+ assertEq(config.get(1, "weth").toAddress(), 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
+ address[] memory address_array = config.get(1, "deps").toAddressArray();
+ assertEq(address_array[0], 0x0000000000000000000000000000000000000000);
+ assertEq(address_array[1], 0x1111111111111111111111111111111111111111);
+
+ // Read and assert bytes32 values
+ assertEq(config.get(1, "word").toBytes32(), bytes32(uint256(1234)));
+ bytes32[] memory bytes32_array = config.get(1, "word_array").toBytes32Array();
+ assertEq(bytes32_array[0], bytes32(uint256(5678)));
+ assertEq(bytes32_array[1], bytes32(uint256(9999)));
+
+ // Read and assert uint values
+ assertEq(config.get(1, "number").toUint256(), 1234);
+ uint256[] memory uint_array = config.get(1, "number_array").toUint256Array();
+ assertEq(uint_array[0], 5678);
+ assertEq(uint_array[1], 9999);
+
+ // Read and assert int values
+ assertEq(config.get(1, "signed_number").toInt256(), -1234);
+ int256[] memory int_array = config.get(1, "signed_number_array").toInt256Array();
+ assertEq(int_array[0], -5678);
+ assertEq(int_array[1], 9999);
+
+ // Read and assert bytes values
+ assertEq(config.get(1, "b").toBytes(), hex"abcd");
+ bytes[] memory bytes_array = config.get(1, "b_array").toBytesArray();
+ assertEq(bytes_array[0], hex"dead");
+ assertEq(bytes_array[1], hex"beef");
+
+ // Read and assert string values
+ assertEq(config.get(1, "str").toString(), "foo");
+ string[] memory string_array = config.get(1, "str_array").toStringArray();
+ assertEq(string_array[0], "bar");
+ assertEq(string_array[1], "baz");
+
+ // -- OPTIMISM ------------------------------------------------------------
+
+ // Read and assert RPC URL for Optimism (chain ID 10)
+ assertEq(config.getRpcUrl(10), "https://mainnet.optimism.io");
+
+ // Read and assert boolean values
+ assertFalse(config.get(10, "is_live").toBool());
+ bool_array = config.get(10, "bool_array").toBoolArray();
+ assertFalse(bool_array[0]);
+ assertTrue(bool_array[1]);
+
+ // Read and assert address values
+ assertEq(config.get(10, "weth").toAddress(), 0x4200000000000000000000000000000000000006);
+ address_array = config.get(10, "deps").toAddressArray();
+ assertEq(address_array[0], 0x2222222222222222222222222222222222222222);
+ assertEq(address_array[1], 0x3333333333333333333333333333333333333333);
+
+ // Read and assert bytes32 values
+ assertEq(config.get(10, "word").toBytes32(), bytes32(uint256(9999)));
+ bytes32_array = config.get(10, "word_array").toBytes32Array();
+ assertEq(bytes32_array[0], bytes32(uint256(1234)));
+ assertEq(bytes32_array[1], bytes32(uint256(5678)));
+
+ // Read and assert uint values
+ assertEq(config.get(10, "number").toUint256(), 9999);
+ uint_array = config.get(10, "number_array").toUint256Array();
+ assertEq(uint_array[0], 1234);
+ assertEq(uint_array[1], 5678);
+
+ // Read and assert int values
+ assertEq(config.get(10, "signed_number").toInt256(), 9999);
+ int_array = config.get(10, "signed_number_array").toInt256Array();
+ assertEq(int_array[0], -1234);
+ assertEq(int_array[1], -5678);
+
+ // Read and assert bytes values
+ assertEq(config.get(10, "b").toBytes(), hex"dcba");
+ bytes_array = config.get(10, "b_array").toBytesArray();
+ assertEq(bytes_array[0], hex"c0ffee");
+ assertEq(bytes_array[1], hex"babe");
+
+ // Read and assert string values
+ assertEq(config.get(10, "str").toString(), "alice");
+ string_array = config.get(10, "str_array").toStringArray();
+ assertEq(string_array[0], "bob");
+ assertEq(string_array[1], "charlie");
+ }
+
+ function test_loadConfigAndForks() public {
+ _loadConfigAndForks("./test/fixtures/config.toml", false);
+
+ // assert that the map of chain id and fork ids is created and that the chain ids actually match
+ assertEq(forkOf[1], 0);
+ vm.selectFork(forkOf[1]);
+ assertEq(vm.getChainId(), 1);
+
+ assertEq(forkOf[10], 1);
+ vm.selectFork(forkOf[10]);
+ assertEq(vm.getChainId(), 10);
+ }
+
+ function test_writeConfig() public {
+ // Create a temporary copy of the config file to avoid modifying the original.
+ string memory originalConfig = "./test/fixtures/config.toml";
+ string memory testConfig = "./test/fixtures/config.t.toml";
+ vm.copyFile(originalConfig, testConfig);
+
+ // Deploy the config contract with the temporary fixture.
+ _loadConfig(testConfig, false);
+
+ // Enable writing to file bypassing the context check.
+ vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1)));
+
+ {
+ // Update a single boolean value and verify the change.
+ config.set(1, "is_live", false);
+
+ assertFalse(config.get(1, "is_live").toBool());
+
+ string memory content = vm.readFile(testConfig);
+ assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live"));
+
+ // Update a single address value and verify the change.
+ address new_addr = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF;
+ config.set(1, "weth", new_addr);
+
+ assertEq(config.get(1, "weth").toAddress(), new_addr);
+
+ content = vm.readFile(testConfig);
+ assertEq(vm.parseTomlAddress(content, "$.mainnet.address.weth"), new_addr);
+
+ // Update a uint array and verify the change.
+ uint256[] memory new_numbers = new uint256[](3);
+ new_numbers[0] = 1;
+ new_numbers[1] = 2;
+ new_numbers[2] = 3;
+ config.set(10, "number_array", new_numbers);
+
+ uint256[] memory updated_numbers_mem = config.get(10, "number_array").toUint256Array();
+ assertEq(updated_numbers_mem.length, 3);
+ assertEq(updated_numbers_mem[0], 1);
+ assertEq(updated_numbers_mem[1], 2);
+ assertEq(updated_numbers_mem[2], 3);
+
+ content = vm.readFile(testConfig);
+ uint256[] memory updated_numbers_disk = vm.parseTomlUintArray(content, "$.optimism.uint.number_array");
+ assertEq(updated_numbers_disk.length, 3);
+ assertEq(updated_numbers_disk[0], 1);
+ assertEq(updated_numbers_disk[1], 2);
+ assertEq(updated_numbers_disk[2], 3);
+
+ // Update a string array and verify the change.
+ string[] memory new_strings = new string[](2);
+ new_strings[0] = "hello";
+ new_strings[1] = "world";
+ config.set(1, "str_array", new_strings);
+
+ string[] memory updated_strings_mem = config.get(1, "str_array").toStringArray();
+ assertEq(updated_strings_mem.length, 2);
+ assertEq(updated_strings_mem[0], "hello");
+ assertEq(updated_strings_mem[1], "world");
+
+ content = vm.readFile(testConfig);
+ string[] memory updated_strings_disk = vm.parseTomlStringArray(content, "$.mainnet.string.str_array");
+ assertEq(updated_strings_disk.length, 2);
+ assertEq(updated_strings_disk[0], "hello");
+ assertEq(updated_strings_disk[1], "world");
+
+ // Create a new uint variable and verify the change.
+ config.set(1, "new_uint", uint256(42));
+
+ assertEq(config.get(1, "new_uint").toUint256(), 42);
+
+ content = vm.readFile(testConfig);
+ assertEq(vm.parseTomlUint(content, "$.mainnet.uint.new_uint"), 42);
+
+ // Create a new int variable and verify the change.
+ config.set(1, "new_int", int256(-42));
+
+ assertEq(config.get(1, "new_int").toInt256(), -42);
+
+ content = vm.readFile(testConfig);
+ assertEq(vm.parseTomlInt(content, "$.mainnet.int.new_int"), -42);
+
+ // Create a new int array and verify the change.
+ int256[] memory new_ints = new int256[](2);
+ new_ints[0] = -100;
+ new_ints[1] = 200;
+ config.set(10, "new_ints", new_ints);
+
+ int256[] memory updated_ints_mem = config.get(10, "new_ints").toInt256Array();
+ assertEq(updated_ints_mem.length, 2);
+ assertEq(updated_ints_mem[0], -100);
+ assertEq(updated_ints_mem[1], 200);
+
+ content = vm.readFile(testConfig);
+ int256[] memory updated_ints_disk = vm.parseTomlIntArray(content, "$.optimism.int.new_ints");
+ assertEq(updated_ints_disk.length, 2);
+ assertEq(updated_ints_disk[0], -100);
+ assertEq(updated_ints_disk[1], 200);
+
+ // Create a new bytes32 array and verify the change.
+ bytes32[] memory new_words = new bytes32[](2);
+ new_words[0] = bytes32(uint256(0xDEAD));
+ new_words[1] = bytes32(uint256(0xBEEF));
+ config.set(10, "new_words", new_words);
+
+ bytes32[] memory updated_words_mem = config.get(10, "new_words").toBytes32Array();
+ assertEq(updated_words_mem.length, 2);
+ assertEq(updated_words_mem[0], new_words[0]);
+ assertEq(updated_words_mem[1], new_words[1]);
+
+ content = vm.readFile(testConfig);
+ bytes32[] memory updated_words_disk = vm.parseTomlBytes32Array(content, "$.optimism.bytes32.new_words");
+ assertEq(updated_words_disk.length, 2);
+ assertEq(vm.toString(updated_words_disk[0]), vm.toString(new_words[0]));
+ assertEq(vm.toString(updated_words_disk[1]), vm.toString(new_words[1]));
+ }
+
+ // Clean up the temporary file.
+ vm.removeFile(testConfig);
+ }
+
+ function test_writeUpdatesBackToFile() public {
+ // Create a temporary copy of the config file to avoid modifying the original.
+ string memory originalConfig = "./test/fixtures/config.toml";
+ string memory testConfig = "./test/fixtures/write_config.t.toml";
+ vm.copyFile(originalConfig, testConfig);
+
+ // Deploy the config contract with `writeToFile = false` (disabled).
+ _loadConfig(testConfig, false);
+
+ // Update a single boolean value and verify the file is NOT changed.
+ config.set(1, "is_live", false);
+ string memory content = vm.readFile(testConfig);
+ assertTrue(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should not be updated yet");
+
+ // Enable writing to file bypassing the context check.
+ vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1)));
+
+ // Update the value again and verify the file IS changed.
+ config.set(1, "is_live", false);
+ content = vm.readFile(testConfig);
+ assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should be updated now");
+
+ // Disable writing to file.
+ config.writeUpdatesBackToFile(false);
+
+ // Update the value again and verify the file is NOT changed.
+ config.set(1, "is_live", true);
+ content = vm.readFile(testConfig);
+ assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should not be updated again");
+
+ // Clean up the temporary file.
+ vm.removeFile(testConfig);
+ }
+
+ function testRevert_WriteToFileInForbiddenCtxt() public {
+ // Cannot initialize enabling writing to file unless we are in SCRIPT mode.
+ vm.expectRevert(StdConfig.WriteToFileInForbiddenCtxt.selector);
+ _loadConfig("./test/fixtures/config.toml", true);
+
+ // Initialize with `writeToFile = false`.
+ _loadConfig("./test/fixtures/config.toml", false);
+
+ // Cannot enable writing to file unless we are in SCRIPT mode.
+ vm.expectRevert(StdConfig.WriteToFileInForbiddenCtxt.selector);
+ config.writeUpdatesBackToFile(true);
+ }
+
+ function testRevert_InvalidChainKey() public {
+ // Create a fixture with an invalid chain key
+ string memory invalidChainConfig = "./test/fixtures/config_invalid_chain.toml";
+ vm.writeFile(
+ invalidChainConfig,
+ string.concat(
+ "[mainnet]\n",
+ "endpoint_url = \"https://eth.llamarpc.com\"\n",
+ "\n",
+ "[mainnet.uint]\n",
+ "valid_number = 123\n",
+ "\n",
+ "# Invalid chain key (not a number and not a valid alias)\n",
+ "[invalid_chain]\n",
+ "endpoint_url = \"https://invalid.com\"\n",
+ "\n",
+ "[invalid_chain_9999.uint]\n",
+ "some_value = 456\n"
+ )
+ );
+
+ vm.expectRevert(abi.encodeWithSelector(StdConfig.InvalidChainKey.selector, "invalid_chain"));
+ new StdConfig(invalidChainConfig, false);
+ vm.removeFile(invalidChainConfig);
+ }
+
+ function testRevert_ChainNotInitialized() public {
+ _loadConfig("./test/fixtures/config.toml", false);
+
+ // Enable writing to file bypassing the context check.
+ vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1)));
+
+ // Try to write a value for a non-existent chain ID
+ vm.expectRevert(abi.encodeWithSelector(StdConfig.ChainNotInitialized.selector, uint256(999999)));
+ config.set(999999, "some_key", uint256(123));
+ }
+
+ function testRevert_UnableToParseVariable() public {
+ // Create a temporary fixture with an unparsable variable
+ string memory badParseConfig = "./test/fixtures/config_bad_parse.toml";
+ vm.writeFile(
+ badParseConfig,
+ string.concat(
+ "[mainnet]\n",
+ "endpoint_url = \"https://eth.llamarpc.com\"\n",
+ "\n",
+ "[mainnet.uint]\n",
+ "bad_value = \"not_a_number\"\n"
+ )
+ );
+
+ vm.expectRevert(abi.encodeWithSelector(StdConfig.UnableToParseVariable.selector, "bad_value"));
+ new StdConfig(badParseConfig, false);
+ vm.removeFile(badParseConfig);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/LibVariable.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/LibVariable.t.sol
new file mode 100644
index 000000000..2fc00a91a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/LibVariable.t.sol
@@ -0,0 +1,434 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.13;
+
+import {Test} from "../src/Test.sol";
+import {Variable, Type, TypeKind, LibVariable} from "../src/LibVariable.sol";
+
+contract LibVariableTest is Test {
+ using LibVariable for Type;
+ using LibVariable for TypeKind;
+
+ LibVariableHelper internal helper;
+
+ bytes internal expectedErr;
+ Variable internal uninitVar;
+ Variable internal boolVar;
+ Variable internal addressVar;
+ Variable internal bytes32Var;
+ Variable internal uintVar;
+ Variable internal intVar;
+ Variable internal stringVar;
+ Variable internal bytesVar;
+ Variable internal boolArrayVar;
+ Variable internal addressArrayVar;
+ Variable internal bytes32ArrayVar;
+ Variable internal uintArrayVar;
+ Variable internal intArrayVar;
+ Variable internal stringArrayVar;
+ Variable internal bytesArrayVar;
+
+ function setUp() public {
+ helper = new LibVariableHelper();
+
+ // UNINITIALIZED
+ uninitVar = Variable(Type(TypeKind.None, false), "");
+
+ // SINGLE VALUES
+ boolVar = Variable(Type(TypeKind.Bool, false), abi.encode(true));
+ addressVar = Variable(Type(TypeKind.Address, false), abi.encode(address(0xdeadbeef)));
+ bytes32Var = Variable(Type(TypeKind.Bytes32, false), abi.encode(bytes32(uint256(42))));
+ uintVar = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(123)));
+ intVar = Variable(Type(TypeKind.Int256, false), abi.encode(int256(-123)));
+ stringVar = Variable(Type(TypeKind.String, false), abi.encode("hello world"));
+ bytesVar = Variable(Type(TypeKind.Bytes, false), abi.encode(hex"c0ffee"));
+
+ // ARRAY VALUES
+ bool[] memory bools = new bool[](2);
+ bools[0] = true;
+ bools[1] = false;
+ boolArrayVar = Variable(Type(TypeKind.Bool, true), abi.encode(bools));
+
+ address[] memory addrs = new address[](2);
+ addrs[0] = address(0x1);
+ addrs[1] = address(0x2);
+ addressArrayVar = Variable(Type(TypeKind.Address, true), abi.encode(addrs));
+
+ bytes32[] memory b32s = new bytes32[](2);
+ b32s[0] = bytes32(uint256(1));
+ b32s[1] = bytes32(uint256(2));
+ bytes32ArrayVar = Variable(Type(TypeKind.Bytes32, true), abi.encode(b32s));
+
+ uint256[] memory uints = new uint256[](2);
+ uints[0] = 1;
+ uints[1] = 2;
+ uintArrayVar = Variable(Type(TypeKind.Uint256, true), abi.encode(uints));
+
+ int256[] memory ints = new int256[](2);
+ ints[0] = -1;
+ ints[1] = 2;
+ intArrayVar = Variable(Type(TypeKind.Int256, true), abi.encode(ints));
+
+ string[] memory strings = new string[](2);
+ strings[0] = "one";
+ strings[1] = "two";
+ stringArrayVar = Variable(Type(TypeKind.String, true), abi.encode(strings));
+
+ bytes[] memory b = new bytes[](2);
+ b[0] = hex"01";
+ b[1] = hex"02";
+ bytesArrayVar = Variable(Type(TypeKind.Bytes, true), abi.encode(b));
+ }
+
+ // -- SUCCESS CASES --------------------------------------------------------
+
+ function test_TypeHelpers() public view {
+ // TypeKind.toString()
+ assertEq(TypeKind.None.toString(), "none");
+ assertEq(TypeKind.Bool.toString(), "bool");
+ assertEq(TypeKind.Address.toString(), "address");
+ assertEq(TypeKind.Bytes32.toString(), "bytes32");
+ assertEq(TypeKind.Uint256.toString(), "uint256");
+ assertEq(TypeKind.Int256.toString(), "int256");
+ assertEq(TypeKind.String.toString(), "string");
+ assertEq(TypeKind.Bytes.toString(), "bytes");
+
+ // TypeKind.toTomlKey()
+ assertEq(TypeKind.Uint256.toTomlKey(), "uint");
+ assertEq(TypeKind.Int256.toTomlKey(), "int");
+ assertEq(TypeKind.Bytes32.toTomlKey(), "bytes32");
+
+ // Type.toString()
+ assertEq(boolVar.ty.toString(), "bool");
+ assertEq(boolArrayVar.ty.toString(), "bool[]");
+ assertEq(uintVar.ty.toString(), "uint256");
+ assertEq(uintArrayVar.ty.toString(), "uint256[]");
+ assertEq(uninitVar.ty.toString(), "none");
+
+ // Type.isEqual()
+ assertTrue(boolVar.ty.isEqual(Type(TypeKind.Bool, false)));
+ assertFalse(boolVar.ty.isEqual(Type(TypeKind.Bool, true)));
+ assertFalse(boolVar.ty.isEqual(Type(TypeKind.Address, false)));
+
+ // Type.assertEq()
+ boolVar.ty.assertEq(Type(TypeKind.Bool, false));
+ uintArrayVar.ty.assertEq(Type(TypeKind.Uint256, true));
+ }
+
+ function test_Coercion() public view {
+ // Single values
+ assertTrue(helper.toBool(boolVar));
+ assertEq(helper.toAddress(addressVar), address(0xdeadbeef));
+ assertEq(helper.toBytes32(bytes32Var), bytes32(uint256(42)));
+ assertEq(helper.toUint256(uintVar), 123);
+ assertEq(helper.toInt256(intVar), -123);
+ assertEq(helper.toString(stringVar), "hello world");
+ assertEq(helper.toBytes(bytesVar), hex"c0ffee");
+
+ // Bool array
+ bool[] memory bools = helper.toBoolArray(boolArrayVar);
+ assertEq(bools.length, 2);
+ assertTrue(bools[0]);
+ assertFalse(bools[1]);
+
+ // Address array
+ address[] memory addrs = helper.toAddressArray(addressArrayVar);
+ assertEq(addrs.length, 2);
+ assertEq(addrs[0], address(0x1));
+ assertEq(addrs[1], address(0x2));
+
+ // String array
+ string[] memory strings = helper.toStringArray(stringArrayVar);
+ assertEq(strings.length, 2);
+ assertEq(strings[0], "one");
+ assertEq(strings[1], "two");
+ }
+
+ function test_Downcasting() public view {
+ // Uint downcasting
+ Variable memory v_uint_small = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(100)));
+ assertEq(helper.toUint128(v_uint_small), 100);
+ assertEq(helper.toUint64(v_uint_small), 100);
+ assertEq(helper.toUint32(v_uint_small), 100);
+ assertEq(helper.toUint16(v_uint_small), 100);
+ assertEq(helper.toUint8(v_uint_small), 100);
+
+ // Uint array downcasting
+ uint256[] memory small_uints = new uint256[](2);
+ small_uints[0] = 10;
+ small_uints[1] = 20;
+ Variable memory v_uint_array_small = Variable(Type(TypeKind.Uint256, true), abi.encode(small_uints));
+ uint8[] memory u8_array = helper.toUint8Array(v_uint_array_small);
+ assertEq(u8_array[0], 10);
+ assertEq(u8_array[1], 20);
+
+ // Int downcasting
+ Variable memory v_int_small_pos = Variable(Type(TypeKind.Int256, false), abi.encode(int256(100)));
+ Variable memory v_int_small_neg = Variable(Type(TypeKind.Int256, false), abi.encode(int256(-100)));
+ assertEq(helper.toInt128(v_int_small_pos), 100);
+ assertEq(helper.toInt64(v_int_small_neg), -100);
+ assertEq(helper.toInt32(v_int_small_pos), 100);
+ assertEq(helper.toInt16(v_int_small_neg), -100);
+ assertEq(helper.toInt8(v_int_small_pos), 100);
+
+ // Int array downcasting
+ int256[] memory small_ints = new int256[](2);
+ small_ints[0] = -10;
+ small_ints[1] = 20;
+ Variable memory intArraySmall = Variable(Type(TypeKind.Int256, true), abi.encode(small_ints));
+ int8[] memory i8_array = helper.toInt8Array(intArraySmall);
+ assertEq(i8_array[0], -10);
+ assertEq(i8_array[1], 20);
+ }
+
+ // -- REVERT CASES ---------------------------------------------------------
+
+ function testRevert_NotInitialized() public {
+ vm.expectRevert(LibVariable.NotInitialized.selector);
+ helper.toBool(uninitVar);
+
+ vm.expectRevert(LibVariable.NotInitialized.selector);
+ helper.toAddressArray(uninitVar);
+ }
+
+ function testRevert_assertExists() public {
+ vm.expectRevert(LibVariable.NotInitialized.selector);
+ helper.assertExists(uninitVar);
+ }
+
+ function testRevert_TypeMismatch() public {
+ // Single values
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256", "bool"));
+ helper.toUint256(boolVar);
+
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "address", "string"));
+ helper.toAddress(stringVar);
+
+ // Arrays
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256[]", "bool[]"));
+ helper.toUint256Array(boolArrayVar);
+
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "address[]", "string[]"));
+ helper.toAddressArray(stringArrayVar);
+
+ // Single value to array
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "bool[]", "bool"));
+ helper.toBoolArray(boolVar);
+
+ // Array to single value
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "bool", "bool[]"));
+ helper.toBool(boolArrayVar);
+
+ // assertEq reverts
+ vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256", "bool"));
+ helper.assertEq(boolVar.ty, Type(TypeKind.Uint256, false));
+ }
+
+ function testRevert_UnsafeCast() public {
+ // uint overflow
+ Variable memory uintLarge = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(type(uint128).max) + 1));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'uint128'");
+ vm.expectRevert(expectedErr);
+ helper.toUint128(uintLarge);
+
+ // int overflow
+ Variable memory intLarge = Variable(Type(TypeKind.Int256, false), abi.encode(int256(type(int128).max) + 1));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'int128'");
+
+ vm.expectRevert(expectedErr);
+ helper.toInt128(intLarge);
+
+ // int underflow
+ Variable memory intSmall = Variable(Type(TypeKind.Int256, false), abi.encode(int256(type(int128).min) - 1));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'int128'");
+
+ vm.expectRevert(expectedErr);
+ helper.toInt128(intSmall);
+
+ // uint array overflow
+ uint256[] memory uintArray = new uint256[](2);
+ uintArray[0] = 10;
+ uintArray[1] = uint256(type(uint64).max) + 1;
+ Variable memory uintArrayLarge = Variable(Type(TypeKind.Uint256, true), abi.encode(uintArray));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'uint64'");
+
+ vm.expectRevert(expectedErr);
+ helper.toUint64Array(uintArrayLarge);
+
+ // int array overflow
+ int256[] memory intArray = new int256[](2);
+ intArray[0] = 10;
+ intArray[1] = int256(type(int64).max) + 1;
+ Variable memory intArrayLarge = Variable(Type(TypeKind.Int256, true), abi.encode(intArray));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'int64'");
+
+ vm.expectRevert(expectedErr);
+ helper.toInt64Array(intArrayLarge);
+
+ // int array underflow
+ intArray[0] = 10;
+ intArray[1] = int256(type(int64).min) - 1;
+ Variable memory intArraySmall = Variable(Type(TypeKind.Int256, true), abi.encode(intArray));
+ expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'int64'");
+
+ vm.expectRevert(expectedErr);
+ helper.toInt64Array(intArraySmall);
+ }
+}
+
+/// @dev We must use an external helper contract to ensure proper call depth for `vm.expectRevert`,
+/// as direct library calls are inlined by the compiler, causing call depth issues.
+contract LibVariableHelper {
+ using LibVariable for Type;
+ using LibVariable for TypeKind;
+
+ // Assertions
+ function assertExists(Variable memory v) external pure {
+ v.assertExists();
+ }
+
+ function assertEq(Type memory t1, Type memory t2) external pure {
+ t1.assertEq(t2);
+ }
+
+ // Single Value Coercion
+ function toBool(Variable memory v) external pure returns (bool) {
+ return v.toBool();
+ }
+
+ function toAddress(Variable memory v) external pure returns (address) {
+ return v.toAddress();
+ }
+
+ function toBytes32(Variable memory v) external pure returns (bytes32) {
+ return v.toBytes32();
+ }
+
+ function toUint256(Variable memory v) external pure returns (uint256) {
+ return v.toUint256();
+ }
+
+ function toInt256(Variable memory v) external pure returns (int256) {
+ return v.toInt256();
+ }
+
+ function toString(Variable memory v) external pure returns (string memory) {
+ return v.toString();
+ }
+
+ function toBytes(Variable memory v) external pure returns (bytes memory) {
+ return v.toBytes();
+ }
+
+ // Array Coercion
+ function toBoolArray(Variable memory v) external pure returns (bool[] memory) {
+ return v.toBoolArray();
+ }
+
+ function toAddressArray(Variable memory v) external pure returns (address[] memory) {
+ return v.toAddressArray();
+ }
+
+ function toBytes32Array(Variable memory v) external pure returns (bytes32[] memory) {
+ return v.toBytes32Array();
+ }
+
+ function toUint256Array(Variable memory v) external pure returns (uint256[] memory) {
+ return v.toUint256Array();
+ }
+
+ function toInt256Array(Variable memory v) external pure returns (int256[] memory) {
+ return v.toInt256Array();
+ }
+
+ function toStringArray(Variable memory v) external pure returns (string[] memory) {
+ return v.toStringArray();
+ }
+
+ function toBytesArray(Variable memory v) external pure returns (bytes[] memory) {
+ return v.toBytesArray();
+ }
+
+ // Uint Downcasting
+ function toUint128(Variable memory v) external pure returns (uint128) {
+ return v.toUint128();
+ }
+
+ function toUint64(Variable memory v) external pure returns (uint64) {
+ return v.toUint64();
+ }
+
+ function toUint32(Variable memory v) external pure returns (uint32) {
+ return v.toUint32();
+ }
+
+ function toUint16(Variable memory v) external pure returns (uint16) {
+ return v.toUint16();
+ }
+
+ function toUint8(Variable memory v) external pure returns (uint8) {
+ return v.toUint8();
+ }
+
+ // Int Downcasting
+ function toInt128(Variable memory v) external pure returns (int128) {
+ return v.toInt128();
+ }
+
+ function toInt64(Variable memory v) external pure returns (int64) {
+ return v.toInt64();
+ }
+
+ function toInt32(Variable memory v) external pure returns (int32) {
+ return v.toInt32();
+ }
+
+ function toInt16(Variable memory v) external pure returns (int16) {
+ return v.toInt16();
+ }
+
+ function toInt8(Variable memory v) external pure returns (int8) {
+ return v.toInt8();
+ }
+
+ // Uint Array Downcasting
+ function toUint128Array(Variable memory v) external pure returns (uint128[] memory) {
+ return v.toUint128Array();
+ }
+
+ function toUint64Array(Variable memory v) external pure returns (uint64[] memory) {
+ return v.toUint64Array();
+ }
+
+ function toUint32Array(Variable memory v) external pure returns (uint32[] memory) {
+ return v.toUint32Array();
+ }
+
+ function toUint16Array(Variable memory v) external pure returns (uint16[] memory) {
+ return v.toUint16Array();
+ }
+
+ function toUint8Array(Variable memory v) external pure returns (uint8[] memory) {
+ return v.toUint8Array();
+ }
+
+ // Int Array Downcasting
+ function toInt128Array(Variable memory v) external pure returns (int128[] memory) {
+ return v.toInt128Array();
+ }
+
+ function toInt64Array(Variable memory v) external pure returns (int64[] memory) {
+ return v.toInt64Array();
+ }
+
+ function toInt32Array(Variable memory v) external pure returns (int32[] memory) {
+ return v.toInt32Array();
+ }
+
+ function toInt16Array(Variable memory v) external pure returns (int16[] memory) {
+ return v.toInt16Array();
+ }
+
+ function toInt8Array(Variable memory v) external pure returns (int8[] memory) {
+ return v.toInt8Array();
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdAssertions.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdAssertions.t.sol
new file mode 100644
index 000000000..acc0c1e81
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdAssertions.t.sol
@@ -0,0 +1,141 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {StdAssertions} from "../src/StdAssertions.sol";
+import {Vm} from "../src/Vm.sol";
+
+interface VmInternal is Vm {
+ function _expectCheatcodeRevert(bytes memory message) external;
+}
+
+contract StdAssertionsTest is StdAssertions {
+ string constant errorMessage = "User provided message";
+ uint256 constant maxDecimals = 77;
+
+ bool constant SHOULD_REVERT = true;
+ bool constant SHOULD_RETURN = false;
+
+ bool constant STRICT_REVERT_DATA = true;
+ bool constant NON_STRICT_REVERT_DATA = false;
+
+ VmInternal constant vm = VmInternal(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function testFuzz_AssertEqCall_Return_Pass(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnData,
+ bool strictRevertData
+ ) external {
+ address targetA = address(new TestMockCall(returnData, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnData, SHOULD_RETURN));
+
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Return_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnDataA,
+ bytes memory returnDataB,
+ bool strictRevertData
+ ) external {
+ vm.assume(keccak256(returnDataA) != keccak256(returnDataB));
+
+ address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN));
+
+ vm._expectCheatcodeRevert(
+ bytes(
+ string.concat(
+ "Call return data does not match: ", vm.toString(returnDataA), " != ", vm.toString(returnDataB)
+ )
+ )
+ );
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+
+ function testFuzz_AssertEqCall_Revert_Pass(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory revertDataA,
+ bytes memory revertDataB
+ ) external {
+ address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT));
+ address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT));
+
+ assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Revert_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory revertDataA,
+ bytes memory revertDataB
+ ) external {
+ vm.assume(keccak256(revertDataA) != keccak256(revertDataB));
+
+ address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT));
+ address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT));
+
+ vm._expectCheatcodeRevert(
+ bytes(
+ string.concat(
+ "Call revert data does not match: ", vm.toString(revertDataA), " != ", vm.toString(revertDataB)
+ )
+ )
+ );
+ assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnDataA,
+ bytes memory returnDataB,
+ bool strictRevertData
+ ) external {
+ address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT));
+
+ vm.expectRevert(bytes("assertion failed"));
+ this.assertEqCallExternal(targetA, callDataA, targetB, callDataB, strictRevertData);
+
+ vm.expectRevert(bytes("assertion failed"));
+ this.assertEqCallExternal(targetB, callDataB, targetA, callDataA, strictRevertData);
+ }
+
+ // Helper function to test outcome of assertEqCall via `expect` cheatcodes
+ function assertEqCallExternal(
+ address targetA,
+ bytes memory callDataA,
+ address targetB,
+ bytes memory callDataB,
+ bool strictRevertData
+ ) public {
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+}
+
+contract TestMockCall {
+ bytes returnData;
+ bool shouldRevert;
+
+ constructor(bytes memory returnData_, bool shouldRevert_) {
+ returnData = returnData_;
+ shouldRevert = shouldRevert_;
+ }
+
+ fallback() external payable {
+ bytes memory returnData_ = returnData;
+
+ if (shouldRevert) {
+ assembly {
+ revert(add(returnData_, 0x20), mload(returnData_))
+ }
+ } else {
+ assembly {
+ return(add(returnData_, 0x20), mload(returnData_))
+ }
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdChains.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdChains.t.sol
new file mode 100644
index 000000000..9522b37d0
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdChains.t.sol
@@ -0,0 +1,227 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test} from "../src/Test.sol";
+
+contract StdChainsMock is Test {
+ function exposed_getChain(string memory chainAlias) public returns (Chain memory) {
+ return getChain(chainAlias);
+ }
+
+ function exposed_getChain(uint256 chainId) public returns (Chain memory) {
+ return getChain(chainId);
+ }
+
+ function exposed_setChain(string memory chainAlias, ChainData memory chainData) public {
+ setChain(chainAlias, chainData);
+ }
+
+ function exposed_setFallbackToDefaultRpcUrls(bool useDefault) public {
+ setFallbackToDefaultRpcUrls(useDefault);
+ }
+}
+
+contract StdChainsTest is Test {
+ function test_ChainRpcInitialization() public {
+ // RPCs specified in `foundry.toml` should be updated.
+ assertEq(getChain(1).rpcUrl, "https://eth.merkle.io");
+ assertEq(getChain("optimism_sepolia").rpcUrl, "https://sepolia.optimism.io/");
+ assertEq(getChain("arbitrum_one_sepolia").rpcUrl, "https://sepolia-rollup.arbitrum.io/rpc/");
+
+ // Environment variables should be the next fallback
+ assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc");
+ vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride");
+ assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride");
+ vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc");
+
+ // Cannot override RPCs defined in `foundry.toml`
+ vm.setEnv("MAINNET_RPC_URL", "myoverride2");
+ assertEq(getChain("mainnet").rpcUrl, "https://eth.merkle.io");
+
+ // Other RPCs should remain unchanged.
+ assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545");
+ assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001");
+ }
+
+ // Named with a leading underscore to clarify this is not intended to be run as a normal test,
+ // and is intended to be used in the below `test_Rpcs` test.
+ function _testRpc(string memory rpcAlias) internal {
+ string memory rpcUrl = getChain(rpcAlias).rpcUrl;
+ vm.createSelectFork(rpcUrl);
+ }
+
+ // Ensure we can connect to the default RPC URL for each chain.
+ // Currently commented out since this is slow and public RPCs are flaky, often resulting in failing CI.
+ // function test_Rpcs() public {
+ // _testRpc("mainnet");
+ // _testRpc("sepolia");
+ // _testRpc("holesky");
+ // _testRpc("optimism");
+ // _testRpc("optimism_sepolia");
+ // _testRpc("arbitrum_one");
+ // _testRpc("arbitrum_one_sepolia");
+ // _testRpc("arbitrum_nova");
+ // _testRpc("polygon");
+ // _testRpc("polygon_amoy");
+ // _testRpc("avalanche");
+ // _testRpc("avalanche_fuji");
+ // _testRpc("bnb_smart_chain");
+ // _testRpc("bnb_smart_chain_testnet");
+ // _testRpc("gnosis_chain");
+ // _testRpc("moonbeam");
+ // _testRpc("moonriver");
+ // _testRpc("moonbase");
+ // _testRpc("base_sepolia");
+ // _testRpc("base");
+ // _testRpc("blast_sepolia");
+ // _testRpc("blast");
+ // _testRpc("fantom_opera");
+ // _testRpc("fantom_opera_testnet");
+ // _testRpc("fraxtal");
+ // _testRpc("fraxtal_testnet");
+ // _testRpc("berachain_bartio_testnet");
+ // _testRpc("flare");
+ // _testRpc("flare_coston2");
+ // }
+
+ function test_RevertIf_ChainNotFound() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found.");
+ stdChainsMock.exposed_getChain("does_not_exist");
+ }
+
+ function test_RevertIf_SetChain_ChainIdExist_FirstTest() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\".");
+ stdChainsMock.exposed_setChain("anvil2", ChainData("Anvil", 31337, "URL"));
+ }
+
+ function test_RevertIf_ChainBubbleUp() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ stdChainsMock.exposed_setChain("needs_undefined_env_var", ChainData("", 123456789, ""));
+ // Forge environment variable error.
+ vm.expectRevert();
+ stdChainsMock.exposed_getChain("needs_undefined_env_var");
+ }
+
+ function test_RevertIf_SetChain_ChainIdExists_SecondTest() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ stdChainsMock.exposed_setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+
+ vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".');
+
+ stdChainsMock.exposed_setChain("another_custom_chain", ChainData("", 123456789, ""));
+ }
+
+ function test_SetChain() public {
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+ Chain memory customChain = getChain("custom_chain");
+ assertEq(customChain.name, "Custom Chain");
+ assertEq(customChain.chainId, 123456789);
+ assertEq(customChain.chainAlias, "custom_chain");
+ assertEq(customChain.rpcUrl, "https://custom.chain/");
+ Chain memory chainById = getChain(123456789);
+ assertEq(chainById.name, customChain.name);
+ assertEq(chainById.chainId, customChain.chainId);
+ assertEq(chainById.chainAlias, customChain.chainAlias);
+ assertEq(chainById.rpcUrl, customChain.rpcUrl);
+ customChain.name = "Another Custom Chain";
+ customChain.chainId = 987654321;
+ setChain("another_custom_chain", customChain);
+ Chain memory anotherCustomChain = getChain("another_custom_chain");
+ assertEq(anotherCustomChain.name, "Another Custom Chain");
+ assertEq(anotherCustomChain.chainId, 987654321);
+ assertEq(anotherCustomChain.chainAlias, "another_custom_chain");
+ assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/");
+ // Verify the first chain data was not overwritten
+ chainById = getChain(123456789);
+ assertEq(chainById.name, "Custom Chain");
+ assertEq(chainById.chainId, 123456789);
+ }
+
+ function test_RevertIf_SetEmptyAlias() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string.");
+ stdChainsMock.exposed_setChain("", ChainData("", 123456789, ""));
+ }
+
+ function test_RevertIf_SetNoChainId0() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0.");
+ stdChainsMock.exposed_setChain("alias", ChainData("", 0, ""));
+ }
+
+ function test_RevertIf_GetNoChainId0() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0.");
+ stdChainsMock.exposed_getChain(0);
+ }
+
+ function test_RevertIf_GetNoEmptyAlias() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string.");
+ stdChainsMock.exposed_getChain("");
+ }
+
+ function test_RevertIf_ChainNotInitialized() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found.");
+ stdChainsMock.exposed_getChain("no_such_alias");
+ }
+
+ function test_RevertIf_ChainAliasNotFound() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found.");
+
+ stdChainsMock.exposed_getChain(321);
+ }
+
+ function test_SetChain_ExistingOne() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+ assertEq(getChain(123456789).chainId, 123456789);
+
+ setChain("custom_chain", ChainData("Modified Chain", 9999999999999999999, "https://modified.chain/"));
+ vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found.");
+ stdChainsMock.exposed_getChain(123456789);
+
+ Chain memory modifiedChain = getChain(9999999999999999999);
+ assertEq(modifiedChain.name, "Modified Chain");
+ assertEq(modifiedChain.chainId, 9999999999999999999);
+ assertEq(modifiedChain.rpcUrl, "https://modified.chain/");
+ }
+
+ function test_RevertIf_DontUseDefaultRpcUrl() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ // Should error if default RPCs flag is set to false.
+ stdChainsMock.exposed_setFallbackToDefaultRpcUrls(false);
+ vm.expectRevert();
+ stdChainsMock.exposed_getChain(31337);
+ vm.expectRevert();
+ stdChainsMock.exposed_getChain("sepolia");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdCheats.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdCheats.t.sol
new file mode 100644
index 000000000..57dbcc291
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdCheats.t.sol
@@ -0,0 +1,639 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {StdCheats} from "../src/StdCheats.sol";
+import {Test} from "../src/Test.sol";
+import {stdJson} from "../src/StdJson.sol";
+import {stdToml} from "../src/StdToml.sol";
+import {IERC20} from "../src/interfaces/IERC20.sol";
+
+contract StdCheatsTest is Test {
+ Bar test;
+
+ using stdJson for string;
+
+ function setUp() public {
+ test = new Bar();
+ }
+
+ function test_Skip() public {
+ vm.warp(100);
+ skip(25);
+ assertEq(block.timestamp, 125);
+ }
+
+ function test_Rewind() public {
+ vm.warp(100);
+ rewind(25);
+ assertEq(block.timestamp, 75);
+ }
+
+ function test_Hoax() public {
+ hoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ }
+
+ function test_HoaxOrigin() public {
+ hoax(address(1337), address(1337));
+ test.origin{value: 100}(address(1337));
+ }
+
+ function test_HoaxDifferentAddresses() public {
+ hoax(address(1337), address(7331));
+ test.origin{value: 100}(address(1337), address(7331));
+ }
+
+ function test_StartHoax() public {
+ startHoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ test.bar{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+
+ function test_StartHoaxOrigin() public {
+ startHoax(address(1337), address(1337));
+ test.origin{value: 100}(address(1337));
+ test.origin{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+
+ function test_ChangePrankMsgSender() public {
+ vm.startPrank(address(1337));
+ test.bar(address(1337));
+ changePrank(address(0xdead));
+ test.bar(address(0xdead));
+ changePrank(address(1337));
+ test.bar(address(1337));
+ vm.stopPrank();
+ }
+
+ function test_ChangePrankMsgSenderAndTxOrigin() public {
+ vm.startPrank(address(1337), address(1338));
+ test.origin(address(1337), address(1338));
+ changePrank(address(0xdead), address(0xbeef));
+ test.origin(address(0xdead), address(0xbeef));
+ changePrank(address(1337), address(1338));
+ test.origin(address(1337), address(1338));
+ vm.stopPrank();
+ }
+
+ function test_MakeAccountEquivalence() public {
+ Account memory account = makeAccount("1337");
+ (address addr, uint256 key) = makeAddrAndKey("1337");
+ assertEq(account.addr, addr);
+ assertEq(account.key, key);
+ }
+
+ function test_MakeAddrEquivalence() public {
+ (address addr,) = makeAddrAndKey("1337");
+ assertEq(makeAddr("1337"), addr);
+ }
+
+ function test_MakeAddrSigning() public {
+ (address addr, uint256 key) = makeAddrAndKey("1337");
+ bytes32 hash = keccak256("some_message");
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash);
+ assertEq(ecrecover(hash, v, r, s), addr);
+ }
+
+ function test_Deal() public {
+ deal(address(this), 1 ether);
+ assertEq(address(this).balance, 1 ether);
+ }
+
+ function test_DealToken() public {
+ Bar barToken = new Bar();
+ address bar = address(barToken);
+ deal(bar, address(this), 10000e18);
+ assertEq(barToken.balanceOf(address(this)), 10000e18);
+ }
+
+ function test_DealTokenAdjustTotalSupply() public {
+ Bar barToken = new Bar();
+ address bar = address(barToken);
+ deal(bar, address(this), 10000e18, true);
+ assertEq(barToken.balanceOf(address(this)), 10000e18);
+ assertEq(barToken.totalSupply(), 20000e18);
+ deal(bar, address(this), 0, true);
+ assertEq(barToken.balanceOf(address(this)), 0);
+ assertEq(barToken.totalSupply(), 10000e18);
+ }
+
+ function test_DealERC1155Token() public {
+ BarERC1155 barToken = new BarERC1155();
+ address bar = address(barToken);
+ dealERC1155(bar, address(this), 0, 10000e18, false);
+ assertEq(barToken.balanceOf(address(this), 0), 10000e18);
+ }
+
+ function test_DealERC1155TokenAdjustTotalSupply() public {
+ BarERC1155 barToken = new BarERC1155();
+ address bar = address(barToken);
+ dealERC1155(bar, address(this), 0, 10000e18, true);
+ assertEq(barToken.balanceOf(address(this), 0), 10000e18);
+ assertEq(barToken.totalSupply(0), 20000e18);
+ dealERC1155(bar, address(this), 0, 0, true);
+ assertEq(barToken.balanceOf(address(this), 0), 0);
+ assertEq(barToken.totalSupply(0), 10000e18);
+ }
+
+ function test_DealERC721Token() public {
+ BarERC721 barToken = new BarERC721();
+ address bar = address(barToken);
+ dealERC721(bar, address(2), 1);
+ assertEq(barToken.balanceOf(address(2)), 1);
+ assertEq(barToken.balanceOf(address(1)), 0);
+ dealERC721(bar, address(1), 2);
+ assertEq(barToken.balanceOf(address(1)), 1);
+ assertEq(barToken.balanceOf(bar), 1);
+ }
+
+ function test_DeployCode() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""));
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ }
+
+ function test_DestroyAccount() public {
+ // deploy something to destroy it
+ BarERC721 barToken = new BarERC721();
+ address bar = address(barToken);
+ vm.setNonce(bar, 10);
+ deal(bar, 100);
+
+ uint256 prevThisBalance = address(this).balance;
+ uint256 size;
+ assembly {
+ size := extcodesize(bar)
+ }
+
+ assertGt(size, 0);
+ assertEq(bar.balance, 100);
+ assertEq(vm.getNonce(bar), 10);
+
+ destroyAccount(bar, address(this));
+ assembly {
+ size := extcodesize(bar)
+ }
+ assertEq(address(this).balance, prevThisBalance + 100);
+ assertEq(vm.getNonce(bar), 0);
+ assertEq(size, 0);
+ assertEq(bar.balance, 0);
+ }
+
+ function test_DeployCodeNoArgs() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar");
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ }
+
+ function test_DeployCodeVal() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether);
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ assertEq(deployed.balance, 1 ether);
+ }
+
+ function test_DeployCodeValNoArgs() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether);
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ assertEq(deployed.balance, 1 ether);
+ }
+
+ // We need this so we can call "this.deployCode" rather than "deployCode" directly
+ function deployCodeHelper(string memory what) external {
+ deployCode(what);
+ }
+
+ function test_RevertIf_DeployCodeFail() public {
+ vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed."));
+ this.deployCodeHelper("StdCheats.t.sol:RevertingContract");
+ }
+
+ function getCode(address who) internal view returns (bytes memory o_code) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // retrieve the size of the code, this needs assembly
+ let size := extcodesize(who)
+ // allocate output byte array - this could also be done without assembly
+ // by using o_code = new bytes(size)
+ o_code := mload(0x40)
+ // new "memory end" including padding
+ mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
+ // store length in memory
+ mstore(o_code, size)
+ // actually retrieve the code, this needs assembly
+ extcodecopy(who, add(o_code, 0x20), 0, size)
+ }
+ }
+
+ function test_DeriveRememberKey() public {
+ string memory mnemonic = "test test test test test test test test test test test junk";
+
+ (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0);
+ assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);
+ assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80);
+ }
+
+ function test_BytesToUint() public pure {
+ assertEq(3, bytesToUint_test(hex"03"));
+ assertEq(2, bytesToUint_test(hex"02"));
+ assertEq(255, bytesToUint_test(hex"ff"));
+ assertEq(29625, bytesToUint_test(hex"73b9"));
+ }
+
+ function test_ParseJsonTxDetail() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ string memory json = vm.readFile(path);
+ bytes memory transactionDetails = json.parseRaw(".transactions[0].tx");
+ RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail));
+ Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail);
+ assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);
+ assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512);
+ assertEq(
+ txDetail.data,
+ hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004"
+ );
+ assertEq(txDetail.nonce, 3);
+ assertEq(txDetail.txType, 2);
+ assertEq(txDetail.gas, 29625);
+ assertEq(txDetail.value, 0);
+ }
+
+ function test_ReadEIP1559Transaction() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ uint256 index = 0;
+ Tx1559 memory transaction = readTx1559(path, index);
+ transaction;
+ }
+
+ function test_ReadEIP1559Transactions() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ Tx1559[] memory transactions = readTx1559s(path);
+ transactions;
+ }
+
+ function test_ReadReceipt() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ uint256 index = 5;
+ Receipt memory receipt = readReceipt(path, index);
+ assertEq(
+ receipt.logsBloom,
+ hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"
+ );
+ }
+
+ function test_ReadReceipts() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ Receipt[] memory receipts = readReceipts(path);
+ receipts;
+ }
+
+ function test_GasMeteringModifier() public {
+ uint256 gas_start_normal = gasleft();
+ addInLoop();
+ uint256 gas_used_normal = gas_start_normal - gasleft();
+
+ uint256 gas_start_single = gasleft();
+ addInLoopNoGas();
+ uint256 gas_used_single = gas_start_single - gasleft();
+
+ uint256 gas_start_double = gasleft();
+ addInLoopNoGasNoGas();
+ uint256 gas_used_double = gas_start_double - gasleft();
+
+ assertTrue(gas_used_double + gas_used_single < gas_used_normal);
+ }
+
+ function addInLoop() internal pure returns (uint256) {
+ uint256 b;
+ for (uint256 i; i < 10000; i++) {
+ b += i;
+ }
+ return b;
+ }
+
+ function addInLoopNoGas() internal noGasMetering returns (uint256) {
+ return addInLoop();
+ }
+
+ function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) {
+ return addInLoopNoGas();
+ }
+
+ function bytesToUint_test(bytes memory b) private pure returns (uint256) {
+ uint256 number;
+ for (uint256 i = 0; i < b.length; i++) {
+ number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1))));
+ }
+ return number;
+ }
+
+ function testFuzz_AssumeAddressIsNot(address addr) external {
+ // skip over Payable and NonPayable enums
+ for (uint8 i = 2; i < uint8(type(AddressType).max); i++) {
+ assumeAddressIsNot(addr, AddressType(i));
+ }
+ assertTrue(addr != address(0));
+ assertTrue(addr < address(1) || addr > address(9));
+ assertTrue(addr != address(vm) || addr != 0x000000000000000000636F6e736F6c652e6c6f67);
+ }
+
+ function test_AssumePayable() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+
+ // all should revert since these addresses are not payable
+
+ // VM address
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+
+ // Console address
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumePayable(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ // Create2Deployer
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C);
+
+ // all should pass since these addresses are payable
+
+ // vitalik.eth
+ stdCheatsMock.exposed_assumePayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045);
+
+ // mock payable contract
+ MockContractPayable cp = new MockContractPayable();
+ stdCheatsMock.exposed_assumePayable(address(cp));
+ }
+
+ function test_AssumeNotPayable() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+
+ // all should pass since these addresses are not payable
+
+ // VM address
+ stdCheatsMock.exposed_assumeNotPayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+
+ // Console address
+ stdCheatsMock.exposed_assumeNotPayable(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ // Create2Deployer
+ stdCheatsMock.exposed_assumeNotPayable(0x4e59b44847b379578588920cA78FbF26c0B4956C);
+
+ // all should revert since these addresses are payable
+
+ // vitalik.eth
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumeNotPayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045);
+
+ // mock payable contract
+ MockContractPayable cp = new MockContractPayable();
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumeNotPayable(address(cp));
+ }
+
+ function testFuzz_AssumeNotPrecompile(address addr) external {
+ assumeNotPrecompile(addr, getChain("optimism_sepolia").chainId);
+ assertTrue(
+ addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000))
+ || addr > address(0x4200000000000000000000000000000000000800)
+ );
+ }
+
+ function testFuzz_AssumeNotForgeAddress(address addr) external pure {
+ assumeNotForgeAddress(addr);
+ assertTrue(
+ addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67
+ && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C
+ );
+ }
+
+ function test_RevertIf_CannotDeployCodeTo() external {
+ vm.expectRevert("StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.");
+ this._revertDeployCodeTo();
+ }
+
+ function _revertDeployCodeTo() external {
+ deployCodeTo("StdCheats.t.sol:RevertingContract", address(0));
+ }
+
+ function test_DeployCodeTo() external {
+ address arbitraryAddress = makeAddr("arbitraryAddress");
+
+ deployCodeTo(
+ "StdCheats.t.sol:MockContractWithConstructorArgs",
+ abi.encode(uint256(6), true, bytes20(arbitraryAddress)),
+ 1 ether,
+ arbitraryAddress
+ );
+
+ MockContractWithConstructorArgs ct = MockContractWithConstructorArgs(arbitraryAddress);
+
+ assertEq(arbitraryAddress.balance, 1 ether);
+ assertEq(ct.x(), 6);
+ assertTrue(ct.y());
+ assertEq(ct.z(), bytes20(arbitraryAddress));
+ }
+}
+
+contract StdCheatsMock is StdCheats {
+ function exposed_assumePayable(address addr) external {
+ assumePayable(addr);
+ }
+
+ function exposed_assumeNotPayable(address addr) external {
+ assumeNotPayable(addr);
+ }
+
+ // We deploy a mock version so we can properly test expected reverts.
+ function exposed_assumeNotBlacklisted(address token, address addr) external view {
+ return assumeNotBlacklisted(token, addr);
+ }
+}
+
+contract StdCheatsForkTest is Test {
+ address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD;
+ address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A;
+
+ MockUSDT public USDT;
+ MockUSDC public USDC;
+
+ function setUp() public {
+ USDT = new MockUSDT();
+ USDC = new MockUSDC();
+
+ USDC.setBlacklisted(USDC_BLACKLISTED_USER, true);
+ USDT.setBlacklisted(USDT_BLACKLISTED_USER, true);
+ }
+
+ function test_RevertIf_CannotAssumeNoBlacklisted_EOA() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ address eoa = vm.addr({privateKey: 1});
+ vm.expectRevert("StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.");
+ stdCheatsMock.exposed_assumeNotBlacklisted(eoa, address(0));
+ }
+
+ function testFuzz_AssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external view {
+ assumeNotBlacklisted(address(USDC), addr);
+ assumeNotBlacklisted(address(USDT), addr);
+ assertTrue(true);
+ }
+
+ function test_RevertIf_AssumeNoBlacklisted_USDC() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumeNotBlacklisted(address(USDC), USDC_BLACKLISTED_USER);
+ }
+
+ function testFuzz_AssumeNotBlacklisted_USDC(address addr) external view {
+ assumeNotBlacklisted(address(USDC), addr);
+ assertFalse(USDCLike(USDC).isBlacklisted(addr));
+ }
+
+ function test_RevertIf_AssumeNoBlacklisted_USDT() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumeNotBlacklisted(address(USDT), USDT_BLACKLISTED_USER);
+ }
+
+ function testFuzz_AssumeNotBlacklisted_USDT(address addr) external view {
+ assumeNotBlacklisted(address(USDT), addr);
+ assertFalse(USDTLike(USDT).isBlackListed(addr));
+ }
+}
+
+/// @dev https://etherscan.io/token/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#readProxyContract
+interface USDCLike {
+ function isBlacklisted(address) external view returns (bool);
+}
+
+/// @dev https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#readContract
+interface USDTLike {
+ function isBlackListed(address) external view returns (bool);
+}
+
+contract MockUSDT is USDTLike {
+ mapping(address => bool) private blacklist;
+
+ function isBlackListed(address addr) external view returns (bool) {
+ return blacklist[addr];
+ }
+
+ function setBlacklisted(address addr, bool value) external {
+ blacklist[addr] = value;
+ }
+}
+
+contract MockUSDC is USDCLike {
+ mapping(address => bool) private blacklist;
+
+ function isBlacklisted(address addr) external view returns (bool) {
+ return blacklist[addr];
+ }
+
+ function setBlacklisted(address addr, bool value) external {
+ blacklist[addr] = value;
+ }
+}
+
+contract Bar {
+ constructor() payable {
+ /// `DEAL` STDCHEAT
+ totalSupply = 10000e18;
+ balanceOf[address(this)] = totalSupply;
+ }
+
+ /// `HOAX` and `CHANGEPRANK` STDCHEATS
+ function bar(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ }
+
+ function origin(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ require(tx.origin == expectedSender, "!prank");
+ }
+
+ function origin(address expectedSender, address expectedOrigin) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ require(tx.origin == expectedOrigin, "!prank");
+ }
+
+ /// `DEAL` STDCHEAT
+ mapping(address => uint256) public balanceOf;
+ uint256 public totalSupply;
+}
+
+contract BarERC1155 {
+ constructor() payable {
+ /// `DEALERC1155` STDCHEAT
+ _totalSupply[0] = 10000e18;
+ _balances[0][address(this)] = _totalSupply[0];
+ }
+
+ function balanceOf(address account, uint256 id) public view virtual returns (uint256) {
+ return _balances[id][account];
+ }
+
+ function totalSupply(uint256 id) public view virtual returns (uint256) {
+ return _totalSupply[id];
+ }
+
+ /// `DEALERC1155` STDCHEAT
+ mapping(uint256 => mapping(address => uint256)) private _balances;
+ mapping(uint256 => uint256) private _totalSupply;
+}
+
+contract BarERC721 {
+ constructor() payable {
+ /// `DEALERC721` STDCHEAT
+ _owners[1] = address(1);
+ _balances[address(1)] = 1;
+ _owners[2] = address(this);
+ _owners[3] = address(this);
+ _balances[address(this)] = 2;
+ }
+
+ function balanceOf(address owner) public view virtual returns (uint256) {
+ return _balances[owner];
+ }
+
+ function ownerOf(uint256 tokenId) public view virtual returns (address) {
+ address owner = _owners[tokenId];
+ return owner;
+ }
+
+ mapping(uint256 => address) private _owners;
+ mapping(address => uint256) private _balances;
+}
+
+contract RevertingContract {
+ constructor() {
+ revert();
+ }
+}
+
+contract MockContractWithConstructorArgs {
+ uint256 public immutable x;
+ bool public y;
+ bytes20 public z;
+
+ constructor(uint256 _x, bool _y, bytes20 _z) payable {
+ x = _x;
+ y = _y;
+ z = _z;
+ }
+}
+
+contract MockContractPayable {
+ receive() external payable {}
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdConstants.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdConstants.t.sol
new file mode 100644
index 000000000..7a00530f4
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdConstants.t.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {StdConstants} from "../src/StdConstants.sol";
+import {Test} from "../src/Test.sol";
+
+contract StdConstantsTest is Test {
+ function testVm() public view {
+ assertEq(StdConstants.VM.getBlockNumber(), 1);
+ }
+
+ function testVmDerivation() public pure {
+ assertEq(address(StdConstants.VM), address(uint160(uint256(keccak256("hevm cheat code")))));
+ }
+
+ function testConsoleDerivation() public pure {
+ assertEq(StdConstants.CONSOLE, address(uint160(uint88(bytes11("console.log")))));
+ }
+
+ function testDefaultSender() public view {
+ assertEq(StdConstants.DEFAULT_SENDER, msg.sender);
+ }
+
+ function testDefaultSenderDerivation() public pure {
+ assertEq(StdConstants.DEFAULT_SENDER, address(uint160(uint256(keccak256("foundry default caller")))));
+ }
+
+ function testDefaultTestContract() public {
+ assertEq(StdConstants.DEFAULT_TEST_CONTRACT, address(new Dummy()));
+ }
+
+ function testDefaultTestContractDerivation() public view {
+ assertEq(address(this), StdConstants.VM.computeCreateAddress(StdConstants.DEFAULT_SENDER, 1));
+ assertEq(StdConstants.DEFAULT_TEST_CONTRACT, StdConstants.VM.computeCreateAddress(address(this), 1));
+ }
+}
+
+contract Dummy {}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdError.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdError.t.sol
new file mode 100644
index 000000000..29803d5d5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdError.t.sol
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.8.0 <0.9.0;
+
+import {stdError} from "../src/StdError.sol";
+import {Test} from "../src/Test.sol";
+
+contract StdErrorsTest is Test {
+ ErrorsTest test;
+
+ function setUp() public {
+ test = new ErrorsTest();
+ }
+
+ function test_RevertIf_AssertionError() public {
+ vm.expectRevert(stdError.assertionError);
+ test.assertionError();
+ }
+
+ function test_RevertIf_ArithmeticError() public {
+ vm.expectRevert(stdError.arithmeticError);
+ test.arithmeticError(10);
+ }
+
+ function test_RevertIf_DivisionError() public {
+ vm.expectRevert(stdError.divisionError);
+ test.divError(0);
+ }
+
+ function test_RevertIf_ModError() public {
+ vm.expectRevert(stdError.divisionError);
+ test.modError(0);
+ }
+
+ function test_RevertIf_EnumConversionError() public {
+ vm.expectRevert(stdError.enumConversionError);
+ test.enumConversion(1);
+ }
+
+ function test_RevertIf_EncodeStgError() public {
+ vm.expectRevert(stdError.encodeStorageError);
+ test.encodeStgError();
+ }
+
+ function test_RevertIf_PopError() public {
+ vm.expectRevert(stdError.popError);
+ test.pop();
+ }
+
+ function test_RevertIf_IndexOOBError() public {
+ vm.expectRevert(stdError.indexOOBError);
+ test.indexOOBError(1);
+ }
+
+ function test_RevertIf_MemOverflowError() public {
+ vm.expectRevert(stdError.memOverflowError);
+ test.mem();
+ }
+
+ function test_RevertIf_InternError() public {
+ vm.expectRevert(stdError.zeroVarError);
+ test.intern();
+ }
+}
+
+contract ErrorsTest {
+ enum T {
+ T1
+ }
+
+ uint256[] public someArr;
+ bytes someBytes;
+
+ function assertionError() public pure {
+ assert(false);
+ }
+
+ function arithmeticError(uint256 a) public pure {
+ a -= 100;
+ }
+
+ function divError(uint256 a) public pure {
+ 100 / a;
+ }
+
+ function modError(uint256 a) public pure {
+ 100 % a;
+ }
+
+ function enumConversion(uint256 a) public pure {
+ T(a);
+ }
+
+ function encodeStgError() public {
+ /// @solidity memory-safe-assembly
+ assembly {
+ sstore(someBytes.slot, 1)
+ }
+ keccak256(someBytes);
+ }
+
+ function pop() public {
+ someArr.pop();
+ }
+
+ function indexOOBError(uint256 a) public pure {
+ uint256[] memory t = new uint256[](0);
+ t[a];
+ }
+
+ function mem() public pure {
+ uint256 l = 2 ** 256 / 32;
+ new uint256[](l);
+ }
+
+ function intern() public returns (uint256) {
+ function(uint256) internal returns (uint256) x;
+ x(2);
+ return 7;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdJson.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdJson.t.sol
new file mode 100644
index 000000000..6bedfcc9a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdJson.t.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test, stdJson} from "../src/Test.sol";
+
+contract StdJsonTest is Test {
+ using stdJson for string;
+
+ string root;
+ string path;
+
+ function setUp() public {
+ root = vm.projectRoot();
+ path = string.concat(root, "/test/fixtures/test.json");
+ }
+
+ struct SimpleJson {
+ uint256 a;
+ string b;
+ }
+
+ struct NestedJson {
+ uint256 a;
+ string b;
+ SimpleJson c;
+ }
+
+ function test_readJson() public view {
+ string memory json = vm.readFile(path);
+ assertEq(json.readUint(".a"), 123);
+ }
+
+ function test_writeJson() public {
+ string memory json = "json";
+ json.serialize("a", uint256(123));
+ string memory semiFinal = json.serialize("b", string("test"));
+ string memory finalJson = json.serialize("c", semiFinal);
+ finalJson.write(path);
+
+ string memory json_ = vm.readFile(path);
+ bytes memory data = json_.parseRaw("$");
+ NestedJson memory decodedData = abi.decode(data, (NestedJson));
+
+ assertEq(decodedData.a, 123);
+ assertEq(decodedData.b, "test");
+ assertEq(decodedData.c.a, 123);
+ assertEq(decodedData.c.b, "test");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdMath.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdMath.t.sol
new file mode 100644
index 000000000..d1269a02a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdMath.t.sol
@@ -0,0 +1,202 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.8.0 <0.9.0;
+
+import {stdMath} from "../src/StdMath.sol";
+import {Test, stdError} from "../src/Test.sol";
+
+contract StdMathMock is Test {
+ function exposed_percentDelta(uint256 a, uint256 b) public pure returns (uint256) {
+ return stdMath.percentDelta(a, b);
+ }
+
+ function exposed_percentDelta(int256 a, int256 b) public pure returns (uint256) {
+ return stdMath.percentDelta(a, b);
+ }
+}
+
+contract StdMathTest is Test {
+ function test_GetAbs() external pure {
+ assertEq(stdMath.abs(-50), 50);
+ assertEq(stdMath.abs(50), 50);
+ assertEq(stdMath.abs(-1337), 1337);
+ assertEq(stdMath.abs(0), 0);
+
+ assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1);
+ assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1));
+ }
+
+ function testFuzz_GetAbs(int256 a) external pure {
+ uint256 manualAbs = getAbs(a);
+
+ uint256 abs = stdMath.abs(a);
+
+ assertEq(abs, manualAbs);
+ }
+
+ function test_GetDelta_Uint() external pure {
+ assertEq(stdMath.delta(uint256(0), uint256(0)), 0);
+ assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337);
+ assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max);
+ assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max);
+ assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max);
+
+ assertEq(stdMath.delta(0, uint256(0)), 0);
+ assertEq(stdMath.delta(1337, uint256(0)), 1337);
+ assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max);
+ assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max);
+ assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max);
+
+ assertEq(stdMath.delta(1337, uint256(1337)), 0);
+ assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0);
+ assertEq(stdMath.delta(5000, uint256(1250)), 3750);
+ }
+
+ function testFuzz_GetDelta_Uint(uint256 a, uint256 b) external pure {
+ uint256 manualDelta = a > b ? a - b : b - a;
+
+ uint256 delta = stdMath.delta(a, b);
+
+ assertEq(delta, manualDelta);
+ }
+
+ function test_GetDelta_Int() external pure {
+ assertEq(stdMath.delta(int256(0), int256(0)), 0);
+ assertEq(stdMath.delta(int256(0), int256(1337)), 1337);
+ assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1);
+ assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1);
+ assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1);
+
+ assertEq(stdMath.delta(0, int256(0)), 0);
+ assertEq(stdMath.delta(1337, int256(0)), 1337);
+ assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1);
+ assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1);
+ assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1);
+
+ assertEq(stdMath.delta(-0, int256(0)), 0);
+ assertEq(stdMath.delta(-1337, int256(0)), 1337);
+ assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1);
+ assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1);
+ assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1);
+
+ assertEq(stdMath.delta(int256(0), -0), 0);
+ assertEq(stdMath.delta(int256(0), -1337), 1337);
+ assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1);
+ assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1);
+ assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1);
+
+ assertEq(stdMath.delta(1337, int256(1337)), 0);
+ assertEq(stdMath.delta(type(int256).max, type(int256).max), 0);
+ assertEq(stdMath.delta(type(int256).min, type(int256).min), 0);
+ assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max);
+ assertEq(stdMath.delta(5000, int256(1250)), 3750);
+ }
+
+ function testFuzz_GetDelta_Int(int256 a, int256 b) external pure {
+ uint256 absA = getAbs(a);
+ uint256 absB = getAbs(b);
+ uint256 absDelta = absA > absB ? absA - absB : absB - absA;
+
+ uint256 manualDelta;
+ if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) {
+ manualDelta = absDelta;
+ }
+ // (a < 0 && b >= 0) || (a >= 0 && b < 0)
+ else {
+ manualDelta = absA + absB;
+ }
+
+ uint256 delta = stdMath.delta(a, b);
+
+ assertEq(delta, manualDelta);
+ }
+
+ function test_GetPercentDelta_Uint() external {
+ StdMathMock stdMathMock = new StdMathMock();
+
+ assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18);
+
+ assertEq(stdMath.percentDelta(1337, uint256(1337)), 0);
+ assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0);
+ assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(2500, uint256(2500)), 0);
+ assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18);
+
+ vm.expectRevert(stdError.divisionError);
+ stdMathMock.exposed_percentDelta(uint256(1), 0);
+ }
+
+ function testFuzz_GetPercentDelta_Uint(uint192 a, uint192 b) external pure {
+ vm.assume(b != 0);
+ uint256 manualDelta = a > b ? a - b : b - a;
+
+ uint256 manualPercentDelta = manualDelta * 1e18 / b;
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ assertEq(percentDelta, manualPercentDelta);
+ }
+
+ function test_GetPercentDelta_Int() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdMathMock stdMathMock = new StdMathMock();
+
+ assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), -1337), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18);
+
+ assertEq(stdMath.percentDelta(1337, int256(1337)), 0);
+ assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0);
+ assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0);
+
+ assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down
+ assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down
+ assertEq(stdMath.percentDelta(0, int256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(2500, int256(2500)), 0);
+ assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18);
+
+ vm.expectRevert(stdError.divisionError);
+ stdMathMock.exposed_percentDelta(int256(1), 0);
+ }
+
+ function testFuzz_GetPercentDelta_Int(int192 a, int192 b) external pure {
+ vm.assume(b != 0);
+ uint256 absA = getAbs(a);
+ uint256 absB = getAbs(b);
+ uint256 absDelta = absA > absB ? absA - absB : absB - absA;
+
+ uint256 manualDelta;
+ if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) {
+ manualDelta = absDelta;
+ }
+ // (a < 0 && b >= 0) || (a >= 0 && b < 0)
+ else {
+ manualDelta = absA + absB;
+ }
+
+ uint256 manualPercentDelta = manualDelta * 1e18 / absB;
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ assertEq(percentDelta, manualPercentDelta);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ HELPERS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function getAbs(int256 a) private pure returns (uint256) {
+ if (a < 0) {
+ return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a);
+ }
+
+ return uint256(a);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdStorage.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdStorage.t.sol
new file mode 100644
index 000000000..46604f866
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdStorage.t.sol
@@ -0,0 +1,488 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {stdStorage, StdStorage} from "../src/StdStorage.sol";
+import {Test} from "../src/Test.sol";
+
+contract StdStorageTest is Test {
+ using stdStorage for StdStorage;
+
+ StorageTest internal test;
+
+ function setUp() public {
+ test = new StorageTest();
+ }
+
+ function test_StorageHidden() public {
+ assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find());
+ }
+
+ function test_StorageObvious() public {
+ assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find());
+ }
+
+ function test_StorageExtraSload() public {
+ assertEq(16, stdstore.target(address(test)).sig(test.extra_sload.selector).find());
+ }
+
+ function test_StorageCheckedWriteHidden() public {
+ stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100);
+ assertEq(uint256(test.hidden()), 100);
+ }
+
+ function test_StorageCheckedWriteObvious() public {
+ stdstore.target(address(test)).sig(test.exists.selector).checked_write(100);
+ assertEq(test.exists(), 100);
+ }
+
+ function test_StorageCheckedWriteSignedIntegerHidden() public {
+ stdstore.target(address(test)).sig(test.hidden.selector).checked_write_int(-100);
+ assertEq(int256(uint256(test.hidden())), -100);
+ }
+
+ function test_StorageCheckedWriteSignedIntegerObvious() public {
+ stdstore.target(address(test)).sig(test.tG.selector).checked_write_int(-100);
+ assertEq(test.tG(), -100);
+ }
+
+ function test_StorageMapStructA() public {
+ uint256 slot =
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot);
+ }
+
+ function test_StorageMapStructB() public {
+ uint256 slot =
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot);
+ }
+
+ function test_StorageDeepMap() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(
+ address(this)
+ ).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot);
+ }
+
+ function test_StorageCheckedWriteDeepMap() public {
+ stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this))
+ .checked_write(100);
+ assertEq(100, test.deep_map(address(this), address(this)));
+ }
+
+ function test_StorageDeepMapStructA() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(0).find();
+ assertEq(
+ bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0),
+ bytes32(slot)
+ );
+ }
+
+ function test_StorageDeepMapStructB() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(1).find();
+ assertEq(
+ bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1),
+ bytes32(slot)
+ );
+ }
+
+ function test_StorageCheckedWriteDeepMapStructA() public {
+ stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key(
+ address(this)
+ ).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this));
+ assertEq(100, a);
+ assertEq(0, b);
+ }
+
+ function test_StorageCheckedWriteDeepMapStructB() public {
+ stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key(
+ address(this)
+ ).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this));
+ assertEq(0, a);
+ assertEq(100, b);
+ }
+
+ function test_StorageCheckedWriteMapStructA() public {
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.map_struct(address(this));
+ assertEq(a, 100);
+ assertEq(b, 0);
+ }
+
+ function test_StorageCheckedWriteMapStructB() public {
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.map_struct(address(this));
+ assertEq(a, 0);
+ assertEq(b, 100);
+ }
+
+ function test_StorageStructA() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find();
+ assertEq(uint256(7), slot);
+ }
+
+ function test_StorageStructB() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find();
+ assertEq(uint256(7) + 1, slot);
+ }
+
+ function test_StorageCheckedWriteStructA() public {
+ stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.basic();
+ assertEq(a, 100);
+ assertEq(b, 1337);
+ }
+
+ function test_StorageCheckedWriteStructB() public {
+ stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.basic();
+ assertEq(a, 1337);
+ assertEq(b, 100);
+ }
+
+ function test_StorageMapAddrFound() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot);
+ }
+
+ function test_StorageMapAddrRoot() public {
+ (uint256 slot, bytes32 key) =
+ stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).parent();
+ assertEq(address(uint160(uint256(key))), address(this));
+ assertEq(uint256(1), slot);
+ slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).root();
+ assertEq(uint256(1), slot);
+ }
+
+ function test_StorageMapUintFound() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find();
+ assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot);
+ }
+
+ function test_StorageCheckedWriteMapUint() public {
+ stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100);
+ assertEq(100, test.map_uint(100));
+ }
+
+ function test_StorageCheckedWriteMapAddr() public {
+ stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100);
+ assertEq(100, test.map_addr(address(this)));
+ }
+
+ function test_StorageCheckedWriteMapBool() public {
+ stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true);
+ assertTrue(test.map_bool(address(this)));
+ }
+
+ function testFuzz_StorageCheckedWriteMapPacked(address addr, uint128 value) public {
+ stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_lower.selector).with_key(addr)
+ .checked_write(value);
+ assertEq(test.read_struct_lower(addr), value);
+
+ stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_upper.selector).with_key(addr)
+ .checked_write(value);
+ assertEq(test.read_struct_upper(addr), value);
+ }
+
+ function test_StorageCheckedWriteMapPackedFullSuccess() public {
+ uint256 full = test.map_packed(address(1337));
+ // keep upper 128, set lower 128 to 1337
+ full = (full & (uint256((1 << 128) - 1) << 128)) | 1337;
+ stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write(
+ full
+ );
+ assertEq(1337, test.read_struct_lower(address(1337)));
+ }
+
+ function test_RevertStorageConst() public {
+ StorageTestTarget target = new StorageTestTarget(test);
+
+ vm.expectRevert("stdStorage find(StdStorage): No storage use detected for target.");
+ target.expectRevertStorageConst();
+ }
+
+ function testFuzz_StorageNativePack(uint248 val1, uint248 val2, bool boolVal1, bool boolVal2) public {
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tA.selector).checked_write(val1);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tB.selector).checked_write(boolVal1);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tC.selector).checked_write(boolVal2);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tD.selector).checked_write(val2);
+
+ assertEq(test.tA(), val1);
+ assertEq(test.tB(), boolVal1);
+ assertEq(test.tC(), boolVal2);
+ assertEq(test.tD(), val2);
+ }
+
+ function test_StorageReadBytes32() public {
+ bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32();
+ assertEq(val, hex"1337");
+ }
+
+ function test_StorageReadBool_False() public {
+ bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool();
+ assertEq(val, false);
+ }
+
+ function test_StorageReadBool_True() public {
+ bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool();
+ assertEq(val, true);
+ }
+
+ function test_RevertIf_ReadingNonBoolValue() public {
+ vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.");
+ this.readNonBoolValue();
+ }
+
+ function readNonBoolValue() public {
+ stdstore.target(address(test)).sig(test.tE.selector).read_bool();
+ }
+
+ function test_StorageReadAddress() public {
+ address val = stdstore.target(address(test)).sig(test.tF.selector).read_address();
+ assertEq(val, address(1337));
+ }
+
+ function test_StorageReadUint() public {
+ uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint();
+ assertEq(val, 1);
+ }
+
+ function test_StorageReadInt() public {
+ int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int();
+ assertEq(val, type(int256).min);
+ }
+
+ function testFuzz_Packed(uint256 val, uint8 elemToGet) public {
+ // This function tries an assortment of packed slots, shifts meaning number of elements
+ // that are packed. Shiftsizes are the size of each element, i.e. 8 means a data type that is 8 bits, 16 == 16 bits, etc.
+ // Combined, these determine how a slot is packed. Making it random is too hard to avoid global rejection limit
+ // and make it performant.
+
+ // change the number of shifts
+ for (uint256 i = 1; i < 5; i++) {
+ uint256 shifts = i;
+
+ elemToGet = uint8(bound(elemToGet, 0, shifts - 1));
+
+ uint256[] memory shiftSizes = new uint256[](shifts);
+ for (uint256 j; j < shifts; j++) {
+ shiftSizes[j] = 8 * (j + 1);
+ }
+
+ test.setRandomPacking(val);
+
+ uint256 leftBits;
+ uint256 rightBits;
+ for (uint256 j; j < shiftSizes.length; j++) {
+ if (j < elemToGet) {
+ leftBits += shiftSizes[j];
+ } else if (elemToGet != j) {
+ rightBits += shiftSizes[j];
+ }
+ }
+
+ // we may have some right bits unaccounted for
+ leftBits += 256 - (leftBits + shiftSizes[elemToGet] + rightBits);
+ // clear left bits, then clear right bits and realign
+ uint256 expectedValToRead = (val << leftBits) >> (leftBits + rightBits);
+
+ uint256 readVal = stdstore.target(address(test)).enable_packed_slots().sig(
+ "getRandomPacked(uint8,uint8[],uint8)"
+ ).with_calldata(abi.encode(shifts, shiftSizes, elemToGet)).read_uint();
+
+ assertEq(readVal, expectedValToRead);
+ }
+ }
+
+ function testFuzz_Packed2(uint256 nvars, uint256 seed) public {
+ // Number of random variables to generate.
+ nvars = bound(nvars, 1, 20);
+
+ // This will decrease as we generate values in the below loop.
+ uint256 bitsRemaining = 256;
+
+ // Generate a random value and size for each variable.
+ uint256[] memory vals = new uint256[](nvars);
+ uint256[] memory sizes = new uint256[](nvars);
+ uint256[] memory offsets = new uint256[](nvars);
+
+ for (uint256 i = 0; i < nvars; i++) {
+ // Generate a random value and size.
+ offsets[i] = i == 0 ? 0 : offsets[i - 1] + sizes[i - 1];
+
+ uint256 nvarsRemaining = nvars - i;
+ uint256 maxVarSize = bitsRemaining - nvarsRemaining + 1;
+ sizes[i] = bound(uint256(keccak256(abi.encodePacked(seed, i + 256))), 1, maxVarSize);
+ bitsRemaining -= sizes[i];
+
+ uint256 maxVal;
+ uint256 varSize = sizes[i];
+ assembly {
+ // mask = (1 << varSize) - 1
+ maxVal := sub(shl(varSize, 1), 1)
+ }
+ vals[i] = bound(uint256(keccak256(abi.encodePacked(seed, i))), 0, maxVal);
+ }
+
+ // Pack all values into the slot.
+ for (uint256 i = 0; i < nvars; i++) {
+ stdstore.enable_packed_slots().target(address(test)).sig("getRandomPacked(uint256,uint256)").with_key(
+ sizes[i]
+ ).with_key(offsets[i]).checked_write(vals[i]);
+ }
+
+ // Verify the read data matches.
+ for (uint256 i = 0; i < nvars; i++) {
+ uint256 readVal = stdstore.enable_packed_slots().target(address(test)).sig(
+ "getRandomPacked(uint256,uint256)"
+ ).with_key(sizes[i]).with_key(offsets[i]).read_uint();
+
+ uint256 retVal = test.getRandomPacked(sizes[i], offsets[i]);
+
+ assertEq(readVal, vals[i]);
+ assertEq(retVal, vals[i]);
+ }
+ }
+
+ function testEdgeCaseArray() public {
+ stdstore.target(address(test)).sig("edgeCaseArray(uint256)").with_key(uint256(0)).checked_write(1);
+ assertEq(test.edgeCaseArray(0), 1);
+ }
+}
+
+contract StorageTestTarget {
+ using stdStorage for StdStorage;
+
+ StdStorage internal stdstore;
+ StorageTest internal test;
+
+ constructor(StorageTest test_) {
+ test = test_;
+ }
+
+ function expectRevertStorageConst() public {
+ stdstore.target(address(test)).sig("const()").find();
+ }
+}
+
+contract StorageTest {
+ uint256 public exists = 1;
+ mapping(address => uint256) public map_addr;
+ mapping(uint256 => uint256) public map_uint;
+ mapping(address => uint256) public map_packed;
+ mapping(address => UnpackedStruct) public map_struct;
+ mapping(address => mapping(address => uint256)) public deep_map;
+ mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct;
+ UnpackedStruct public basic;
+
+ uint248 public tA;
+ bool public tB;
+
+ bool public tC = false;
+ uint248 public tD = 1;
+
+ struct UnpackedStruct {
+ uint256 a;
+ uint256 b;
+ }
+
+ mapping(address => bool) public map_bool;
+
+ bytes32 public tE = hex"1337";
+ address public tF = address(1337);
+ int256 public tG = type(int256).min;
+ bool public tH = true;
+ bytes32 private tI = ~bytes32(hex"1337");
+
+ uint256 randomPacking;
+
+ // Array with length matching values of elements.
+ uint256[] public edgeCaseArray = [3, 3, 3];
+
+ constructor() {
+ basic = UnpackedStruct({a: 1337, b: 1337});
+
+ uint256 two = (1 << 128) | 1;
+ map_packed[msg.sender] = two;
+ map_packed[address(uint160(1337))] = 1 << 128;
+ }
+
+ function read_struct_upper(address who) public view returns (uint256) {
+ return map_packed[who] >> 128;
+ }
+
+ function read_struct_lower(address who) public view returns (uint256) {
+ return map_packed[who] & ((1 << 128) - 1);
+ }
+
+ function hidden() public view returns (bytes32 t) {
+ bytes32 slot = keccak256("my.random.var");
+ /// @solidity memory-safe-assembly
+ assembly {
+ t := sload(slot)
+ }
+ }
+
+ function const() public pure returns (bytes32 t) {
+ t = bytes32(hex"1337");
+ }
+
+ function extra_sload() public view returns (bytes32 t) {
+ // trigger read on slot `tE`, and make a staticcall to make sure compiler doesn't optimize this SLOAD away
+ assembly {
+ pop(staticcall(gas(), sload(tE.slot), 0, 0, 0, 0))
+ }
+ t = tI;
+ }
+
+ function setRandomPacking(uint256 val) public {
+ randomPacking = val;
+ }
+
+ function _getMask(uint256 size) internal pure returns (uint256 mask) {
+ assembly {
+ // mask = (1 << size) - 1
+ mask := sub(shl(size, 1), 1)
+ }
+ }
+
+ function setRandomPacking(uint256 val, uint256 size, uint256 offset) public {
+ // Generate mask based on the size of the value
+ uint256 mask = _getMask(size);
+ // Zero out all bits for the word we're about to set
+ uint256 cleanedWord = randomPacking & ~(mask << offset);
+ // Place val in the correct spot of the cleaned word
+ randomPacking = cleanedWord | val << offset;
+ }
+
+ function getRandomPacked(uint256 size, uint256 offset) public view returns (uint256) {
+ // Generate mask based on the size of the value
+ uint256 mask = _getMask(size);
+ // Shift to place the bits in the correct position, and use mask to zero out remaining bits
+ return (randomPacking >> offset) & mask;
+ }
+
+ function getRandomPacked(uint8 shifts, uint8[] memory shiftSizes, uint8 elem) public view returns (uint256) {
+ require(elem < shifts, "!elem");
+ uint256 leftBits;
+ uint256 rightBits;
+
+ for (uint256 i; i < shiftSizes.length; i++) {
+ if (i < elem) {
+ leftBits += shiftSizes[i];
+ } else if (elem != i) {
+ rightBits += shiftSizes[i];
+ }
+ }
+
+ // we may have some right bits unaccounted for
+ leftBits += 256 - (leftBits + shiftSizes[elem] + rightBits);
+
+ // clear left bits, then clear right bits and realign
+ return (randomPacking << leftBits) >> (leftBits + rightBits);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdStyle.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdStyle.t.sol
new file mode 100644
index 000000000..974e756fe
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdStyle.t.sol
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test, console2, StdStyle} from "../src/Test.sol";
+
+contract StdStyleTest is Test {
+ function test_StyleColor() public pure {
+ console2.log(StdStyle.red("StdStyle.red String Test"));
+ console2.log(StdStyle.red(uint256(10e18)));
+ console2.log(StdStyle.red(int256(-10e18)));
+ console2.log(StdStyle.red(true));
+ console2.log(StdStyle.red(address(0)));
+ console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.redBytes32("StdStyle.redBytes32"));
+ console2.log(StdStyle.green("StdStyle.green String Test"));
+ console2.log(StdStyle.green(uint256(10e18)));
+ console2.log(StdStyle.green(int256(-10e18)));
+ console2.log(StdStyle.green(true));
+ console2.log(StdStyle.green(address(0)));
+ console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32"));
+ console2.log(StdStyle.yellow("StdStyle.yellow String Test"));
+ console2.log(StdStyle.yellow(uint256(10e18)));
+ console2.log(StdStyle.yellow(int256(-10e18)));
+ console2.log(StdStyle.yellow(true));
+ console2.log(StdStyle.yellow(address(0)));
+ console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32"));
+ console2.log(StdStyle.blue("StdStyle.blue String Test"));
+ console2.log(StdStyle.blue(uint256(10e18)));
+ console2.log(StdStyle.blue(int256(-10e18)));
+ console2.log(StdStyle.blue(true));
+ console2.log(StdStyle.blue(address(0)));
+ console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32"));
+ console2.log(StdStyle.magenta("StdStyle.magenta String Test"));
+ console2.log(StdStyle.magenta(uint256(10e18)));
+ console2.log(StdStyle.magenta(int256(-10e18)));
+ console2.log(StdStyle.magenta(true));
+ console2.log(StdStyle.magenta(address(0)));
+ console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32"));
+ console2.log(StdStyle.cyan("StdStyle.cyan String Test"));
+ console2.log(StdStyle.cyan(uint256(10e18)));
+ console2.log(StdStyle.cyan(int256(-10e18)));
+ console2.log(StdStyle.cyan(true));
+ console2.log(StdStyle.cyan(address(0)));
+ console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32"));
+ }
+
+ function test_StyleFontWeight() public pure {
+ console2.log(StdStyle.bold("StdStyle.bold String Test"));
+ console2.log(StdStyle.bold(uint256(10e18)));
+ console2.log(StdStyle.bold(int256(-10e18)));
+ console2.log(StdStyle.bold(address(0)));
+ console2.log(StdStyle.bold(true));
+ console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32"));
+ console2.log(StdStyle.dim("StdStyle.dim String Test"));
+ console2.log(StdStyle.dim(uint256(10e18)));
+ console2.log(StdStyle.dim(int256(-10e18)));
+ console2.log(StdStyle.dim(address(0)));
+ console2.log(StdStyle.dim(true));
+ console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32"));
+ console2.log(StdStyle.italic("StdStyle.italic String Test"));
+ console2.log(StdStyle.italic(uint256(10e18)));
+ console2.log(StdStyle.italic(int256(-10e18)));
+ console2.log(StdStyle.italic(address(0)));
+ console2.log(StdStyle.italic(true));
+ console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32"));
+ console2.log(StdStyle.underline("StdStyle.underline String Test"));
+ console2.log(StdStyle.underline(uint256(10e18)));
+ console2.log(StdStyle.underline(int256(-10e18)));
+ console2.log(StdStyle.underline(address(0)));
+ console2.log(StdStyle.underline(true));
+ console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32"));
+ console2.log(StdStyle.inverse("StdStyle.inverse String Test"));
+ console2.log(StdStyle.inverse(uint256(10e18)));
+ console2.log(StdStyle.inverse(int256(-10e18)));
+ console2.log(StdStyle.inverse(address(0)));
+ console2.log(StdStyle.inverse(true));
+ console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32"));
+ }
+
+ function test_StyleCombined() public pure {
+ console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test")));
+ console2.log(StdStyle.green(StdStyle.dim(uint256(10e18))));
+ console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18))));
+ console2.log(StdStyle.blue(StdStyle.underline(address(0))));
+ console2.log(StdStyle.magenta(StdStyle.inverse(true)));
+ }
+
+ function test_StyleCustom() public pure {
+ console2.log(h1("Custom Style 1"));
+ console2.log(h2("Custom Style 2"));
+ }
+
+ function h1(string memory a) private pure returns (string memory) {
+ return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a)));
+ }
+
+ function h2(string memory a) private pure returns (string memory) {
+ return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a)));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdToml.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdToml.t.sol
new file mode 100644
index 000000000..5a45f4f5c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdToml.t.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test, stdToml} from "../src/Test.sol";
+
+contract StdTomlTest is Test {
+ using stdToml for string;
+
+ string root;
+ string path;
+
+ function setUp() public {
+ root = vm.projectRoot();
+ path = string.concat(root, "/test/fixtures/test.toml");
+ }
+
+ struct SimpleToml {
+ uint256 a;
+ string b;
+ }
+
+ struct NestedToml {
+ uint256 a;
+ string b;
+ SimpleToml c;
+ }
+
+ function test_readToml() public view {
+ string memory json = vm.readFile(path);
+ assertEq(json.readUint(".a"), 123);
+ }
+
+ function test_writeToml() public {
+ string memory json = "json";
+ json.serialize("a", uint256(123));
+ string memory semiFinal = json.serialize("b", string("test"));
+ string memory finalJson = json.serialize("c", semiFinal);
+ finalJson.write(path);
+
+ string memory toml = vm.readFile(path);
+ bytes memory data = toml.parseRaw("$");
+ NestedToml memory decodedData = abi.decode(data, (NestedToml));
+
+ assertEq(decodedData.a, 123);
+ assertEq(decodedData.b, "test");
+ assertEq(decodedData.c.a, 123);
+ assertEq(decodedData.c.b, "test");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/StdUtils.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/StdUtils.t.sol
new file mode 100644
index 000000000..aee801b2c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/StdUtils.t.sol
@@ -0,0 +1,342 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test, StdUtils} from "../src/Test.sol";
+
+contract StdUtilsMock is StdUtils {
+ // We deploy a mock version so we can properly test expected reverts.
+ function exposed_getTokenBalances(address token, address[] memory addresses)
+ external
+ returns (uint256[] memory balances)
+ {
+ return getTokenBalances(token, addresses);
+ }
+
+ function exposed_bound(int256 num, int256 min, int256 max) external pure returns (int256) {
+ return bound(num, min, max);
+ }
+
+ function exposed_bound(uint256 num, uint256 min, uint256 max) external pure returns (uint256) {
+ return bound(num, min, max);
+ }
+
+ function exposed_bytesToUint(bytes memory b) external pure returns (uint256) {
+ return bytesToUint(b);
+ }
+}
+
+contract StdUtilsTest is Test {
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND UINT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_Bound() public pure {
+ assertEq(bound(uint256(5), 0, 4), 0);
+ assertEq(bound(uint256(0), 69, 69), 69);
+ assertEq(bound(uint256(0), 68, 69), 68);
+ assertEq(bound(uint256(10), 150, 190), 174);
+ assertEq(bound(uint256(300), 2800, 3200), 3107);
+ assertEq(bound(uint256(9999), 1337, 6666), 4669);
+ }
+
+ function test_Bound_WithinRange() public pure {
+ assertEq(bound(uint256(51), 50, 150), 51);
+ assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150));
+ assertEq(bound(uint256(149), 50, 150), 149);
+ assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150));
+ }
+
+ function test_Bound_EdgeCoverage() public pure {
+ assertEq(bound(uint256(0), 50, 150), 50);
+ assertEq(bound(uint256(1), 50, 150), 51);
+ assertEq(bound(uint256(2), 50, 150), 52);
+ assertEq(bound(uint256(3), 50, 150), 53);
+ assertEq(bound(type(uint256).max, 50, 150), 150);
+ assertEq(bound(type(uint256).max - 1, 50, 150), 149);
+ assertEq(bound(type(uint256).max - 2, 50, 150), 148);
+ assertEq(bound(type(uint256).max - 3, 50, 150), 147);
+ }
+
+ function testFuzz_Bound_DistributionIsEven(uint256 min, uint256 size) public pure {
+ size = size % 100 + 1;
+ min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size);
+ uint256 max = min + size - 1;
+ uint256 result;
+
+ for (uint256 i = 1; i <= size * 4; ++i) {
+ // x > max
+ result = bound(max + i, min, max);
+ assertEq(result, min + (i - 1) % size);
+ // x < min
+ result = bound(min - i, min, max);
+ assertEq(result, max - (i - 1) % size);
+ }
+ }
+
+ function testFuzz_Bound(uint256 num, uint256 min, uint256 max) public pure {
+ if (min > max) (min, max) = (max, min);
+
+ uint256 result = bound(num, min, max);
+
+ assertGe(result, min);
+ assertLe(result, max);
+ assertEq(result, bound(result, min, max));
+ if (num >= min && num <= max) assertEq(result, num);
+ }
+
+ function test_BoundUint256Max() public pure {
+ assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1);
+ assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max);
+ }
+
+ function test_RevertIf_BoundMaxLessThanMin() public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min."));
+ stdUtils.exposed_bound(uint256(5), 100, 10);
+ }
+
+ function testFuzz_RevertIf_BoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.assume(min > max);
+ vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min."));
+ stdUtils.exposed_bound(num, min, max);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND INT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BoundInt() public pure {
+ assertEq(bound(-3, 0, 4), 2);
+ assertEq(bound(0, -69, -69), -69);
+ assertEq(bound(0, -69, -68), -68);
+ assertEq(bound(-10, 150, 190), 154);
+ assertEq(bound(-300, 2800, 3200), 2908);
+ assertEq(bound(9999, -1337, 6666), 1995);
+ }
+
+ function test_BoundInt_WithinRange() public pure {
+ assertEq(bound(51, -50, 150), 51);
+ assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150));
+ assertEq(bound(149, -50, 150), 149);
+ assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150));
+ }
+
+ function test_BoundInt_EdgeCoverage() public pure {
+ assertEq(bound(type(int256).min, -50, 150), -50);
+ assertEq(bound(type(int256).min + 1, -50, 150), -49);
+ assertEq(bound(type(int256).min + 2, -50, 150), -48);
+ assertEq(bound(type(int256).min + 3, -50, 150), -47);
+ assertEq(bound(type(int256).min, 10, 150), 10);
+ assertEq(bound(type(int256).min + 1, 10, 150), 11);
+ assertEq(bound(type(int256).min + 2, 10, 150), 12);
+ assertEq(bound(type(int256).min + 3, 10, 150), 13);
+
+ assertEq(bound(type(int256).max, -50, 150), 150);
+ assertEq(bound(type(int256).max - 1, -50, 150), 149);
+ assertEq(bound(type(int256).max - 2, -50, 150), 148);
+ assertEq(bound(type(int256).max - 3, -50, 150), 147);
+ assertEq(bound(type(int256).max, -50, -10), -10);
+ assertEq(bound(type(int256).max - 1, -50, -10), -11);
+ assertEq(bound(type(int256).max - 2, -50, -10), -12);
+ assertEq(bound(type(int256).max - 3, -50, -10), -13);
+ }
+
+ function testFuzz_BoundInt_DistributionIsEven(int256 min, uint256 size) public pure {
+ size = size % 100 + 1;
+ min = bound(min, -int256(size / 2), int256(size - size / 2));
+ int256 max = min + int256(size) - 1;
+ int256 result;
+
+ for (uint256 i = 1; i <= size * 4; ++i) {
+ // x > max
+ result = bound(max + int256(i), min, max);
+ assertEq(result, min + int256((i - 1) % size));
+ // x < min
+ result = bound(min - int256(i), min, max);
+ assertEq(result, max - int256((i - 1) % size));
+ }
+ }
+
+ function testFuzz_BoundInt(int256 num, int256 min, int256 max) public pure {
+ if (min > max) (min, max) = (max, min);
+
+ int256 result = bound(num, min, max);
+
+ assertGe(result, min);
+ assertLe(result, max);
+ assertEq(result, bound(result, min, max));
+ if (num >= min && num <= max) assertEq(result, num);
+ }
+
+ function test_BoundIntInt256Max() public pure {
+ assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1);
+ assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max);
+ }
+
+ function test_BoundIntInt256Min() public pure {
+ assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min);
+ assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1);
+ }
+
+ function test_RevertIf_BoundIntMaxLessThanMin() public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min."));
+ stdUtils.exposed_bound(-5, 100, 10);
+ }
+
+ function testFuzz_RevertIf_BoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.assume(min > max);
+ vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min."));
+ stdUtils.exposed_bound(num, min, max);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND PRIVATE KEY
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BoundPrivateKey() public pure {
+ assertEq(boundPrivateKey(0), 1);
+ assertEq(boundPrivateKey(1), 1);
+ assertEq(boundPrivateKey(300), 300);
+ assertEq(boundPrivateKey(9999), 9999);
+ assertEq(boundPrivateKey(SECP256K1_ORDER - 1), SECP256K1_ORDER - 1);
+ assertEq(boundPrivateKey(SECP256K1_ORDER), 1);
+ assertEq(boundPrivateKey(SECP256K1_ORDER + 1), 2);
+ assertEq(boundPrivateKey(UINT256_MAX), UINT256_MAX & SECP256K1_ORDER - 1); // x&y is equivalent to x-x%y
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BYTES TO UINT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BytesToUint() external pure {
+ bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ bytes memory two = hex"02";
+ bytes memory millionEther = hex"d3c21bcecceda1000000";
+
+ assertEq(bytesToUint(maxUint), type(uint256).max);
+ assertEq(bytesToUint(two), 2);
+ assertEq(bytesToUint(millionEther), 1_000_000 ether);
+ }
+
+ function test_RevertIf_BytesLengthExceeds32() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32.");
+ stdUtils.exposed_bytesToUint(thirty3Bytes);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ COMPUTE CREATE ADDRESS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_ComputeCreateAddress() external pure {
+ address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9;
+ uint256 nonce = 14;
+ address createAddress = computeCreateAddress(deployer, nonce);
+ assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ COMPUTE CREATE2 ADDRESS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_ComputeCreate2Address() external pure {
+ bytes32 salt = bytes32(uint256(31415));
+ bytes32 initcodeHash = keccak256(abi.encode(0x6080));
+ address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9;
+ address create2Address = computeCreate2Address(salt, initcodeHash, deployer);
+ assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3);
+ }
+
+ function test_ComputeCreate2AddressWithDefaultDeployer() external pure {
+ bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0;
+ bytes32 initcodeHash = hashInitCode(hex"6080", "");
+ assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0);
+ address create2Address = computeCreate2Address(salt, initcodeHash);
+ assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6);
+ }
+}
+
+contract StdUtilsForkTest is Test {
+ /*//////////////////////////////////////////////////////////////////////////
+ GET TOKEN BALANCES
+ //////////////////////////////////////////////////////////////////////////*/
+
+ address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
+ address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170;
+ address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA;
+ address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385;
+
+ address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17;
+ address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52;
+
+ function setUp() public {
+ // All tests of the `getTokenBalances` method are fork tests using live contracts.
+ vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900});
+ }
+
+ function test_RevertIf_CannotGetTokenBalances_NonTokenContract() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function,
+ // so the `balanceOf` call should revert.
+ address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
+ address[] memory addresses = new address[](1);
+ addresses[0] = USDC_HOLDER_0;
+
+ vm.expectRevert("Multicall3: call failed");
+ stdUtils.exposed_getTokenBalances(token, addresses);
+ }
+
+ function test_RevertIf_CannotGetTokenBalances_EOA() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ address eoa = vm.addr({privateKey: 1});
+ address[] memory addresses = new address[](1);
+ addresses[0] = USDC_HOLDER_0;
+ vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract.");
+ stdUtils.exposed_getTokenBalances(eoa, addresses);
+ }
+
+ function test_GetTokenBalances_Empty() external {
+ address[] memory addresses = new address[](0);
+ uint256[] memory balances = getTokenBalances(USDC, addresses);
+ assertEq(balances.length, 0);
+ }
+
+ function test_GetTokenBalances_USDC() external {
+ address[] memory addresses = new address[](2);
+ addresses[0] = USDC_HOLDER_0;
+ addresses[1] = USDC_HOLDER_1;
+ uint256[] memory balances = getTokenBalances(USDC, addresses);
+ assertEq(balances[0], 159_000_000_000_000);
+ assertEq(balances[1], 131_350_000_000_000);
+ }
+
+ function test_GetTokenBalances_SHIB() external {
+ address[] memory addresses = new address[](3);
+ addresses[0] = SHIB_HOLDER_0;
+ addresses[1] = SHIB_HOLDER_1;
+ addresses[2] = SHIB_HOLDER_2;
+ uint256[] memory balances = getTokenBalances(SHIB, addresses);
+ assertEq(balances[0], 3_323_256_285_484.42e18);
+ assertEq(balances[1], 1_271_702_771_149.99999928e18);
+ assertEq(balances[2], 606_357_106_247e18);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/Vm.t.sol b/lib/signals-implicit-mode/lib/forge-std/test/Vm.t.sol
new file mode 100644
index 000000000..1b99e3db1
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/Vm.t.sol
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.8.0 <0.9.0;
+
+import {Test} from "../src/Test.sol";
+import {Vm, VmSafe} from "../src/Vm.sol";
+
+// These tests ensure that functions are never accidentally removed from a Vm interface, or
+// inadvertently moved between Vm and VmSafe. These tests must be updated each time a function is
+// added to or removed from Vm or VmSafe.
+contract VmTest is Test {
+ function test_VmInterfaceId() public pure {
+ assertEq(type(Vm).interfaceId, bytes4(0xe835828d), "Vm");
+ }
+
+ function test_VmSafeInterfaceId() public pure {
+ assertEq(type(VmSafe).interfaceId, bytes4(0xe02727c3), "VmSafe");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationScript.sol b/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationScript.sol
new file mode 100644
index 000000000..d3d88a0b5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationScript.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {Script} from "../../src/Script.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationScript is Script {}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationScriptBase.sol b/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationScriptBase.sol
new file mode 100644
index 000000000..65b5bedbe
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationScriptBase.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {ScriptBase} from "../../src/Script.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationScriptBase is ScriptBase {}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationTest.sol b/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationTest.sol
new file mode 100644
index 000000000..2a9dec57f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationTest.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {Test} from "../../src/Test.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationTest is Test {}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationTestBase.sol b/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationTestBase.sol
new file mode 100644
index 000000000..32b3fc5be
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationTestBase.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {TestBase} from "../../src/Test.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationTestBase is TestBase {}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/fixtures/broadcast.log.json b/lib/signals-implicit-mode/lib/forge-std/test/fixtures/broadcast.log.json
new file mode 100644
index 000000000..0a0200bca
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/fixtures/broadcast.log.json
@@ -0,0 +1,187 @@
+{
+ "transactions": [
+ {
+ "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "function": "multiple_arguments(uint256,address,uint256[]):(uint256)",
+ "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "gas": "0x73b9",
+ "value": "0x0",
+ "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004",
+ "nonce": "0x3",
+ "accessList": []
+ }
+ },
+ {
+ "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "function": "inc():(uint256)",
+ "arguments": [],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "gas": "0xdcb2",
+ "value": "0x0",
+ "data": "0x371303c0",
+ "nonce": "0x4",
+ "accessList": []
+ }
+ },
+ {
+ "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "function": "t(uint256):(uint256)",
+ "arguments": ["1"],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "gas": "0x8599",
+ "value": "0x0",
+ "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001",
+ "nonce": "0x5",
+ "accessList": []
+ }
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181",
+ "transactionIndex": "0x0",
+ "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af",
+ "blockNumber": "0x1",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": null,
+ "cumulativeGasUsed": "0x13f3a",
+ "gasUsed": "0x13f3a",
+ "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782",
+ "transactionIndex": "0x0",
+ "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148",
+ "blockNumber": "0x2",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": null,
+ "cumulativeGasUsed": "0x45d80",
+ "gasUsed": "0x45d80",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d",
+ "transactionIndex": "0x0",
+ "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58",
+ "blockNumber": "0x3",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
+ "cumulativeGasUsed": "0x45feb",
+ "gasUsed": "0x45feb",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f",
+ "transactionIndex": "0x0",
+ "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629",
+ "blockNumber": "0x4",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "cumulativeGasUsed": "0x5905",
+ "gasUsed": "0x5905",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298",
+ "transactionIndex": "0x0",
+ "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11",
+ "blockNumber": "0x5",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "cumulativeGasUsed": "0xa9c4",
+ "gasUsed": "0xa9c4",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "transactionIndex": "0x0",
+ "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb",
+ "blockNumber": "0x6",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "cumulativeGasUsed": "0x66c5",
+ "gasUsed": "0x66c5",
+ "contractAddress": null,
+ "logs": [
+ {
+ "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "topics": [
+ "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b"
+ ],
+ "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000",
+ "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb",
+ "blockNumber": "0x6",
+ "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "transactionIndex": "0x1",
+ "logIndex": "0x0",
+ "transactionLogIndex": "0x0",
+ "removed": false
+ }
+ ],
+ "status": "0x1",
+ "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16",
+ "transactionIndex": "0x0",
+ "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c",
+ "blockNumber": "0x7",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x0000000000000000000000000000000000001337",
+ "cumulativeGasUsed": "0x5208",
+ "gasUsed": "0x5208",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ }
+ ],
+ "libraries": [
+ "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3"
+ ],
+ "pending": [],
+ "path": "broadcast/Broadcast.t.sol/31337/run-latest.json",
+ "returns": {},
+ "timestamp": 1655140035
+}
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/fixtures/config.toml b/lib/signals-implicit-mode/lib/forge-std/test/fixtures/config.toml
new file mode 100644
index 000000000..e6dcccca5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/fixtures/config.toml
@@ -0,0 +1,81 @@
+# ------------------------------------------------
+# EXAMPLE DEPLOYMENT CONFIG
+# ------------------------------------------------
+
+# -- MAINNET -------------------------------------
+
+[mainnet]
+endpoint_url = "${MAINNET_RPC}"
+
+[mainnet.bool]
+is_live = true
+bool_array = [true, false]
+
+[mainnet.address]
+weth = "${WETH_MAINNET}"
+deps = [
+ "0x0000000000000000000000000000000000000000",
+ "0x1111111111111111111111111111111111111111",
+]
+
+[mainnet.uint]
+number = 1234
+number_array = [5678, 9999]
+
+[mainnet.int]
+signed_number = -1234
+signed_number_array = [-5678, 9999]
+
+[mainnet.bytes32]
+word = "0x00000000000000000000000000000000000000000000000000000000000004d2" # 1234
+word_array = [
+ "0x000000000000000000000000000000000000000000000000000000000000162e", # 5678
+ "0x000000000000000000000000000000000000000000000000000000000000270f", # 9999
+]
+
+[mainnet.bytes]
+b = "0xabcd"
+b_array = ["0xdead", "0xbeef"]
+
+[mainnet.string]
+str = "foo"
+str_array = ["bar", "baz"]
+
+# -- OPTIMISM ------------------------------------
+
+[optimism]
+endpoint_url = "${OPTIMISM_RPC}"
+
+[optimism.bool]
+is_live = false
+bool_array = [false, true]
+
+[optimism.address]
+weth = "${WETH_OPTIMISM}"
+deps = [
+ "0x2222222222222222222222222222222222222222",
+ "0x3333333333333333333333333333333333333333",
+]
+
+[optimism.uint]
+number = 9999
+number_array = [1234, 5678]
+
+[optimism.int]
+signed_number = 9999
+signed_number_array = [-1234, -5678]
+
+[optimism.bytes32]
+word = "0x000000000000000000000000000000000000000000000000000000000000270f" # 9999
+word_array = [
+ "0x00000000000000000000000000000000000000000000000000000000000004d2", # 1234
+ "0x000000000000000000000000000000000000000000000000000000000000162e", # 5678
+]
+
+[optimism.bytes]
+b = "0xdcba"
+b_array = ["0xc0ffee", "0xbabe"]
+
+[optimism.string]
+str = "alice"
+str_array = ["bob", "charlie"]
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/fixtures/test.json b/lib/signals-implicit-mode/lib/forge-std/test/fixtures/test.json
new file mode 100644
index 000000000..caebf6d96
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/fixtures/test.json
@@ -0,0 +1,8 @@
+{
+ "a": 123,
+ "b": "test",
+ "c": {
+ "a": 123,
+ "b": "test"
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/forge-std/test/fixtures/test.toml b/lib/signals-implicit-mode/lib/forge-std/test/fixtures/test.toml
new file mode 100644
index 000000000..60692bc75
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/forge-std/test/fixtures/test.toml
@@ -0,0 +1,6 @@
+a = 123
+b = "test"
+
+[c]
+a = 123
+b = "test"
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/.env.sample b/lib/signals-implicit-mode/lib/sequence-v3/.env.sample
new file mode 100644
index 000000000..323d6deba
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/.env.sample
@@ -0,0 +1,7 @@
+PRIVATE_KEY=
+ERC4337_ENTRY_POINT_V7=0x0000000071727De22E5E9d8BAf0edAc6f37da032
+
+SEQ_SDK_RPC_URL_PREFIX="http://localhost:"
+SEQ_SDK_RPC_URL_SUFFIX="/rpc"
+SEQ_SDK_RPC_MIN_PORT=9999
+SEQ_SDK_RPC_MAX_PORT=9999
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/.github/workflows/tests.yml b/lib/signals-implicit-mode/lib/sequence-v3/.github/workflows/tests.yml
new file mode 100644
index 000000000..8c2a4a90e
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/.github/workflows/tests.yml
@@ -0,0 +1,148 @@
+name: Tests
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.head_ref || github.sha }}
+ cancel-in-progress: true
+
+on:
+ workflow_dispatch:
+ inputs:
+ sdk_type:
+ description: 'Type of test to run: go or typescript'
+ required: true
+ type: choice
+ options:
+ - go
+ - typescript
+ commit_hash:
+ description: 'Commit hash of the SDK to test against'
+ required: false
+ type: string
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - master
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - name: Go SDK
+ sdk_type: go
+ repo_name: go-sequence
+ clone_url: https://github.com/0xsequence/go-sequence.git
+ repo_url: https://github.com/0xsequence/go-sequence.git
+ ssh_url: git@github.com:0xsequence/go-sequence.git
+ default_branch: v3-core
+ setup_tool: go
+ setup_version: '1.23'
+ build_cmd: go mod tidy && go build -o sequence-server ./cmd/sequence
+ server_cmd: ./sequence-server server &
+ - name: Typescript SDK
+ sdk_type: typescript
+ repo_name: sequence.js
+ clone_url: https://github.com/0xsequence/sequence.js.git
+ repo_url: https://github.com/0xsequence/sequence.js.git
+ ssh_url: git@github.com:0xsequence/sequence.js.git
+ default_branch: master
+ setup_tool: node
+ setup_version: '20'
+ build_cmd: npm install -g pnpm && pnpm install && pnpm run build:packages
+ server_cmd: pnpm dev:server &
+
+ steps:
+ - name: Determine SDK Git Commit
+ id: determine_commit
+ run: |
+ if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ -n "${{ github.event.inputs.commit_hash }}" ]; then
+ echo "commit=${{ github.event.inputs.commit_hash }}" >> $GITHUB_OUTPUT
+ else
+ echo "commit=${{ matrix.default_branch }}" >> $GITHUB_OUTPUT
+ fi
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Clone SDK Repo
+ run: |
+ git clone ${{ matrix.clone_url }} sdk-repo
+ cd sdk-repo
+ git checkout ${{ steps.determine_commit.outputs.commit }}
+ cd ..
+ - name: Set Up Go Environment
+ if: ${{ matrix.setup_tool == 'go' }}
+ uses: actions/setup-go@v4
+ with:
+ ${{ matrix.setup_tool }}-version: ${{ matrix.setup_version }}
+ - name: Set Up Node Environment
+ if: ${{ matrix.setup_tool == 'node' }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ matrix.setup_version }}
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ - name: Install Foundry Dependencies
+ run: forge install
+ - name: Run Build Server
+ run: ${{ matrix.build_cmd }}
+ working-directory: sdk-repo
+ - name: Run Server
+ run: ${{ matrix.server_cmd }}
+ working-directory: sdk-repo
+ - name: Wait for Server
+ run: |
+ sleep 10
+ curl -s http://localhost:9999/rpc -H "Content-type: application/json" -X POST -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' || (echo "Server not ready"; exit 1)
+ echo "Server is ready"
+ - name: Install Dependencies
+ run: forge install
+ - name: Run Tests
+ id: run_tests
+ continue-on-error: true
+ run: |
+ forge test --mp test/modules/BaseSig.t.sol
+ forge test --mp test/modules/Calls.t.sol
+ forge test --mp test/modules/Hooks.t.sol
+ forge test --mp test/modules/Implementation.t.sol
+ forge test --mp test/modules/Nonce.t.sol
+ forge test --mp test/modules/Payload.t.sol
+ forge test --mp test/Factory.t.sol
+ forge test --mp test/Guest.t.sol
+ forge test --mp test/Stage1Module.t.sol
+ forge test --mp test/Wallet.t.sol
+ env:
+ SEQ_SDK_RPC_URL_PREFIX: 'http://localhost:'
+ SEQ_SDK_RPC_URL_SUFFIX: '/rpc'
+ SEQ_SDK_RPC_MIN_PORT: '9999'
+ SEQ_SDK_RPC_MAX_PORT: '9999'
+ - name: Report Status
+ if: ${{ github.event_name != 'workflow_dispatch' }}
+ run: |
+ echo "status=${{ steps.run_tests.outcome == 'success' && 'success' || 'failure' }}" >> $GITHUB_OUTPUT
+ - name: Fail Job If Tests Fail
+ if: ${{ github.event_name != 'workflow_dispatch' && steps.run_tests.outcome == 'failure' }}
+ run: exit 1
+ - name: Update Status
+ if: ${{ github.event_name == 'workflow_dispatch' }}
+ continue-on-error: true
+ uses: actions/github-script@v6
+ with:
+ script: |
+ const { owner, repo } = context;
+ const publicOwner = '0xsequence';
+ const publicRepo = ${{ matrix.repo_name }};
+ const repoUrl = ${{ matrix.repo_url }}
+ const commitSha = '${{ github.event.inputs.commit_hash }}';
+ const token = '${{ secrets.GITHUB_TOKEN }}';
+ const octokit = new Octokit({ auth: token });
+ const state = '${{ steps.run_tests.outcome == 'success' && 'success' || 'failure' }}';
+ await octokit.rest.repos.createCommitStatus({
+ owner: publicOwner,
+ repo: publicRepo,
+ sha: commitSha,
+ state: state,
+ target_url: repoUrl,
+ description: `The build was ${state}`
+ });
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/.gitmodules b/lib/signals-implicit-mode/lib/sequence-v3/.gitmodules
new file mode 100644
index 000000000..9d59c5672
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/.gitmodules
@@ -0,0 +1,12 @@
+[submodule "lib/openzeppelin-contracts"]
+ path = lib/openzeppelin-contracts
+ url = https://github.com/OpenZeppelin/openzeppelin-contracts
+[submodule "lib/erc2470-libs"]
+ path = lib/erc2470-libs
+ url = https://github.com/ScreamingHawk/erc2470-libs
+[submodule "lib/forge-std"]
+ path = lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
+[submodule "lib/account-abstraction"]
+ path = lib/account-abstraction
+ url = https://github.com/eth-infinitism/account-abstraction
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/.prettierignore b/lib/signals-implicit-mode/lib/sequence-v3/.prettierignore
new file mode 100644
index 000000000..f77cc0994
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/.prettierignore
@@ -0,0 +1,4 @@
+node_modules
+**/node_modules
+lib
+**/lib
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/.prettierrc b/lib/signals-implicit-mode/lib/sequence-v3/.prettierrc
new file mode 100644
index 000000000..6fe562bd5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/.prettierrc
@@ -0,0 +1,7 @@
+{
+ "semi": false,
+ "singleQuote": true,
+ "tabWidth": 2,
+ "printWidth": 100,
+ "trailingComma": "es5"
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/LICENSE b/lib/signals-implicit-mode/lib/sequence-v3/LICENSE
new file mode 100644
index 000000000..261eeb9e9
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/README.md b/lib/signals-implicit-mode/lib/sequence-v3/README.md
new file mode 100644
index 000000000..6399141a1
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/README.md
@@ -0,0 +1,53 @@
+# Sequence v3 wallet contracts
+
+Sequence v3 wallet contracts, with implicit and explicit smart sessions.
+
+## Development Setup
+
+Install dependencies
+
+```sh
+pnpm install
+```
+
+Git hooks will be automatically installed.
+
+## Testing
+
+Install the [Sequence v3 SDK](https://github.com/0xsequence/sequence.js) and run a server using the following command:
+
+```sh
+cd ../sequence.js
+pnpm build:packages
+pnpm dev:server
+```
+
+Copy the `env.sample` file to `.env` and set the environment variables.
+
+```sh
+cp .env.sample .env
+# Edit .env
+```
+
+Run tests
+
+```sh
+forge test
+```
+
+Run coverage (ignoring scripts and test files).
+
+```sh
+forge coverage --no-match-coverage "(script|test)"
+# Or to generate and view in browser
+forge coverage --no-match-coverage "(script|test)" --report lcov && genhtml -o report --branch-coverage lcov.info && py -m http.server -d report
+```
+
+Deploy contracts
+
+```sh
+forge script Deploy --rpc-url --broadcast
+```
+
+> [!NOTE]
+> Deployments use ERC-2470 for counter factual deployments.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/build_proxy.sh b/lib/signals-implicit-mode/lib/sequence-v3/build_proxy.sh
new file mode 100644
index 000000000..ce510d2b8
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/build_proxy.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+SOL_VERSION="^0.8.0"
+HUFF_FILE="./src/Wallet.huff"
+SOL_OUT="./src/Wallet.sol"
+BYTECODE=$(huff -z -e paris "$HUFF_FILE" CONSTRUCTOR | sed 's/^0x//')
+HUFF_RAW=$(cat "$HUFF_FILE")
+cat > "$SOL_OUT" < Threshold
+
+All signature parts must meet their respective thresholds.
+
+### Payload order
+
+1. The first signature recovers the given Payload. If its threshold is met, then it generates an `imageHash` which corresponds to the root of a Merkle tree that defines the configuration of the wallet.
+
+2. Following signatures recover the `imageHash` of the previous signature, bundled within a payload of the `KIND_CONFIG_UPDATE` kind. They, in turn, recover to their own next `imageHash`.
+
+3. After the last signature has been recovered, the resulting `imageHash` must match the one defined by the contract.
+
+```
+┌──────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
+│Main payload │ │Config update payload│ │Config update payload│
+│(e.g. send tx)│ │ImageHash 1 │ │ImageHash 2 │
+└─────────────┬┘ └─▲──────────────────┬┘ └─▲──────────────────┬┘
+ │ │ │ │ │
+ Recover ──┤ │ Recover ──┤ │ Recover ──┤
+ │ │ │ │ │
+ ┌──────────▼┐ Generate │ ┌──────────▼┐ Generate │ ┌──────────▼┐
+ │ImageHash 1├──────────┘ │ImageHash 2├──────────┘ │ImageHash 3│
+ └───────────┘ └───────────┘ └─────┬─────┘
+ │
+ │
+ │
+ ╔═════▼═════╗
+ ║ Is valid? ║
+ ╚═══════════╝
+```
+
+### Checkpoint
+
+Each wallet configuration defines a checkpoint, checkpoints define a strict order in which these configurations can be used **in the context of a chained signature**, this acts as a form of replay protection that blocks the usage of a previous section of the state channel **in case the state channel ever repeats configurations**.
+
+For example, a wallet has a configuration with signers `A & B`, then it is updated to `A, B & C` and then updated back again to `A & B`. Afterwards, another update is queued, this time to `A, B & D`. Without the checkpoints, a malicious actor (C) may exploit the first update (where `C` was added) even if the wallet already evicted `C` as a signer.
+
+```
+ Checkpoint 2 -> 0 forbidden
+ ┌─────────────────────────────────────────────┐
+ │ │
+ x │
+┌───────────────┐ ┌─────────────────┐ ┌─────────────┴─┐ ┌─────────────────┐
+│Signers: A & B │ │Signers: A, B & C│ │Signers: A & B │ │Signers: A, B & D│
+│Checkpoint: 0 ├────▶│Checkpoint: 1 ├────▶│Checkpoint: 2 ├────▶│Checkpoint: 3 │
+└───────────────┘ └─────────────────┘ └───────────────┘ └─────────────────┘
+```
+
+## **3. Checkpointer**
+
+The checkpointer is an optional interface that helps wallets keep track of the latest valid configuration without publishing every intermediate step to all chains.
+
+Because wallets exist on multiple chains, unused networks often lag behind and accumulate old states. The checkpointer solves this by announcing the last known valid configuration. Anything older is automatically considered invalid.
+
+Wallet contracts don't specify how the checkpointer works internally. Its only job is to clearly state the latest valid configuration to prevent older states from being reused.
+
+### Disabled checkpointer
+
+Even when a checkpointer is defined by the configuration, the checkpointer has the capability to "disable" itself. This is useful for implementing escape hatches like timelocks or challenge periods, in case that the checkpointer becomes unresponsive or malicious. When the checkpointer announces a snapshot with `imageHash == bytes32(0)` it is considered disabled.
+
+Notice that there is **no built in mechanism** to force the checkpointer to become disabled from within the wallet, any mechanism that may challenge and disable the checkpointer must be implemented on the checkpointer contract.
+
+### Checkpointer data
+
+When a checkpointer is defined by the configuration, obtaining the latest snapshot from it requires passing a generic `data` field to the checkpointer contract. This `data` field is provided within the signature, and it is entirely opaque to the wallet contract.
+
+It wouldn't make sense for the checkpointer to be able to provide the snapshot directly from contract storage, as this would move the requirement of having to settle the state channel from the wallet contract to the checkpointer contract, instead, it is expected that the checkpointer will use the `data` field to validate a proof of the snapshot.
+
+The proof may be implemented as a simple merkle proof, a signature from a trusted party or T.E.E., a zk proof from a keystore rollup, or any other mechanism that may allow the checkpointer to provide a valid snapshot.
+
+### Checkpointer scenarios
+
+Different scenarios exist depending on the current state of the wallet, state channel and checkpointer, and the relationship between them.
+
+#### 1. Full sync
+
+This happens when the wallet contract configuration is set to the latest configuration defined by the state channel, and the checkpointer reports the same configuration.
+
+This scenario does not require the usage of chained signatures, as regular signatures are sufficient when the configuration that is being used matches the one defined by the contract.
+
+```
+ Checkpointer
+ ┌───────────────────────────────────────────────┐
+ │ Wallet │
+ │ ┌─────────────────────┐ │
+ │ ┌──────────────┐ │ ┌──────────────┐ │ │
+ │ │ Config A & B ├──────┼──▶ Config A & C │ │ │
+ │ └──────┬───────┘ │ └──────────────┘ │ │
+ │ │ └─────────────────────┘ │
+ └────────┼──────────────────────────────────────┘
+ │
+ ▼
+Old state - Irrelevant
+```
+
+> Notice that even if no chained signatures are used, the checkpointer is still required to provide a valid snapshot of the latest configuration.
+
+#### 2. Checkpointer Ahead, Wallet Behind
+
+The state channel is ahead of the wallet contract, but the checkpointer knows about the latest configuration. In this scenario, the checkpointer provides a snapshot for the latest configuration, and the wallet **must** use a chained signature to sign the payload, using that latest configuration.
+
+```
+ Checkpointer
+ ┌────────────────────────────────────────────────────────────────────┐
+ │ Wallet │
+ │ ┌─────────────────────┐ │
+ │ ┌──────────────┐ │ ┌──────────────┐ │ ┌──────────────┐ │
+ │ │ Config A & B ├──────┼──▶ Config A & C ├───┼─────▶ Config D & C │ │
+ │ └──────┬───────┘ │ └──────────────┘ │ └───────┬──────┘ │
+ │ │ └─────────────────────┘ │ │
+ └────────┼──────────────────────────────────────────────────┼────────┘
+ │ │
+ ▼ ▼
+Old state - Irrelevant Latest state
+```
+
+#### 3. Checkpointer Behind, Wallet Synced
+
+The checkpointer is behind the wallet contract, and there are no pending configurations in the state channel. In this scenario, the checkpointer will provide a snapshot with a checkpoint that is behind the wallet contract, and this will make the wallet contract ignore the checkpointer's snapshot.
+
+This scenario may happen if the wallet is manually updated to a new configuration without notifying the checkpointer, or if the checkpointer hasn't had time to "react" and "catch up" with the wallet contract. It may be possible that the checkpointer is offline, and not reacting to any configuration changes.
+
+```
+ Checkpointer Wallet
+ ┌──────────────────┐ ┌─────────────────────┐
+ │ ┌──────────────┐ │ │ ┌──────────────┐ │
+ │ │ Config A & B ├─┼────┼──▶ Config A & C │ │
+ │ └──────┬───────┘ │ │ └──────────────┘ │
+ └────────┼─────────┘ └─────────────────────┘
+ │
+ │
+ ▼
+Old state - Irrelevant
+```
+
+#### 4. Wallet Behind, Checkpointer Further Behind
+
+The checkpointer is behind the wallet contract, and there are pending configurations in the state channel. This scenario is very similar to the previous one, the only difference is that the wallet will use a chained signature to sign the payload, using the latest configuration.
+
+Even if the wallet uses a chained signature, since the checkpointer's snapshot checkpoint is behind the wallet contract, the wallet will not use the checkpointer's snapshot.
+
+```
+ Checkpointer Wallet
+ ┌──────────────────┐ ┌─────────────────────┐
+ │ ┌──────────────┐ │ │ ┌──────────────┐ │ ┌──────────────┐
+ │ │ Config A & B ├─┼────┼──▶ Config A & C ├───┼─────▶ Config B & C │
+ │ └──────┬───────┘ │ │ └──────────────┘ │ └──────┬───────┘
+ └────────┼─────────┘ └─────────────────────┘ │
+ │ │
+ │ │
+ ▼ ▼
+Old state - Irrelevant Latest state
+```
+
+#### 5. Checkpointer Ahead, Wallet Behind, State Channel Further Ahead
+
+The state channel has multiple configuration updates, the checkpointer is ahead of the wallet contract, yet the state channel goes further than the checkpointer. This scenario may happen if the latest configuration update happened recently and the checkpointer hasn't updated yet.
+
+In this scenario, the checkpointer provides a snapshot, the wallet contract enforces a chained signature to sign the payload, forcing that the chained signature, at some point, goes over the checkpointer's snapshot.
+
+```
+ Checkpointer
+ ┌────────────────────────────────────────────────────────────────────┐
+ │ Wallet │
+ │ ┌─────────────────────┐ │
+ │ ┌──────────────┐ │ ┌──────────────┐ │ ┌──────────────┐ │ ┌──────────────┐
+ │ │ Config A & B ├──────┼──▶ Config A & C ├───┼─────▶ Config D & C ├─┼───────▶ Config D & E │
+ │ └──────┬───────┘ │ └──────────────┘ │ └──────────────┘ │ └──────┬───────┘
+ │ │ └─────────────────────┘ │ │
+ └────────┼───────────────────────────────────────────────────────────┘ │
+ │ │
+ ▼ ▼
+Old state - Irrelevant Latest state
+```
+
+#### 6. Wallet Synced, Checkpointer Dangling Ahead
+
+The checkpointer may report a future configuration that is not part of the state channel. This may happen if the checkpointer is misbehaving, malicious, or there is a state channel update that has only been revealed to the checkpointer.
+
+In this scenario, the checkpointer contract **must** provide with an escape hatch mechanism for either:
+
+1. Provide the link to the dangling configuration
+2. Disable itself
+
+```
+ Checkpointer
+ ┌────────────────────────────────────────────────────────────────────┐
+ │ Wallet │
+ │ ┌─────────────────────┐ │
+ │ ┌──────────────┐ │ ┌──────────────┐ │ ┌──────────────┐ │
+ │ │ Config A & B ├──────┼──▶ Config A & C ├───┼─x │ Config D & C │ │
+ │ └──────┬───────┘ │ └───────┬──────┘ │ └───────┬──────┘ │
+ │ │ └──────────┼──────────┘ │ │
+ └────────┼─────────────────────────┼────────────────────────┼────────┘
+ │ │ │
+ ▼ ▼ ▼
+Old state - Irrelevant Latest state Dangling, not linked
+```
+
+### Checkpointer signature format
+
+Signatures that involve a checkpointer contain two additional pieces of data, the "checkpointer address" that is used to identify the checkpointer (and to be able to reconstruct the merkle root), and the "checkpointer data" which is needed to obtain the snapshot from the checkpointer.
+
+#### Non-chained signatures
+
+When non-chained signatures are used, the signature flag **must** have the `X1XX XXXX` bit set (`flag & 0x08 == 0x08`), this signals to the wallet contract that the signature involves a checkpointer, afterwards fixed 20 bytes are read to obtain the checkpointer address, and the next 3 bytes are read to obtain the checkpointer data size, after which the checkpointer data is read.
+
+```
+ ┌───▶ 1 byte global flag
+ │ must have the 2nd bit
+ │ set to 1 to signal a chained ┌───▶ 3 bytes define the size
+ │ signature │ of the checkpointer data
+ │ │
+──┴─ ───┴──
+0x40 6974206973207265616c6C792073756E6E791aDd 001271 6b656570206275696c64696e67...
+ ──┬───────────────────────────────────── ─┬───────────────────────────
+ │ │
+ └─▶ 20 byte address └─▶ Dynamic size checkpointer
+ determines the address data
+ of the checkpointer
+```
+
+#### Chained signatures
+
+If chained signatures are used, then the encoding becomes slightly more complex. The reason for this is that the **only** checkpointer that is used is the one that is defined by the wallet contract, **checkpointers provided by the state channel are ignored**.
+
+This is intended behavior, as the checkpointer is in charge of overseeing the state channel, thus it wouldn't be safe for the state channel to be able to provide a checkpointer, as it could self-authorize the state channel. This would negate the purpose of having a checkpointer in the first place.
+
+There is a challenge with this, when a chained signature is encoded, the configuration that corresponds to the wallet contract is provided **at the end of the chain**, which is a problem, because we need to obtain the snapshot at the beginning of the chain, in order to validate if the state channel ever "goes over" the snapshot provided by the checkpointer.
+
+Additionally, intermediary configurations need to have their checkpointers provided, as it is needed to reconstruct the merkle root. However no checkpointer data is needed, as these intermediate checkpointers are not called.
+
+To solve this, when a chained signature is used, and the onchain configuration contains a checkpointer, the checkpointer of the **last** configuration is moved at the beginning of the chain, alongside its checkpointer data, and no checkpointer data is provided for the intermediate signature parts.
+
+```
+ ┌─▶ 2nd. bit signals checkpointer ┌──▶ The checkpointer and data is only
+ │ │ provided once, as part of the
+ │ ┌▶ 8th. bit signals chained │ chained signatures, and not of
+ ┴ ┴ │ the individual parts
+ 0100 0001 │
+ ▲ ┌───────────────────────────────────┴─────────────────────────────────────────┐
+ │ │ 3 byte Size │
+ ──┴─│ ────── │
+ 0x41│6974206973207265616c6C792073756E6E791aDd 001271 6b656570206275696c64696e67...│─┐
+ │──────────────────────────────────────── ────────────────────────────────────│ │
+ │Checkpointer address □ Checkpointer data │ │
+ └─────────────────────╫───────────────────────────────────────────────────────┘ │
+╔═══════════════════════════╝ │
+║ ┌────────────────────────────────────────────────────────────────────────────────┘
+║ │
+║ │ Payload signature ┌─▶ No checkpointer data
+║ │ ┌───────────────────────────────────────────┼───────────────────┐
+║ │ │ x │
+║ └───▶│44 6974206973207265616c6C792073756E6E791aDd 03 01 5151515151...│─┐
+║ │─┬───────────────────────────────────────── │ │
+║ └─┼─────────────────────────────────────────────────────────────┘ │
+║ │ │
+║ └───▶ Signature requires checkpointer │
+║ but no checkpointer data is │
+║ required as it is only for root │
+║ recovery │
+║ │
+║ Checkpointer may or may not match │
+║ │
+║ ┌──────────────────────────────────────────────────────┐ │
+║ ┌─────┤ Intermediary signatures follow the previous format ├─────────┘
+║ │ └──────────────────────────────────────────────────────┘
+║ │
+║ │ Final signature
+║ │ ┌────────────────────────────────┐
+║ │ │ │
+║ └───▶│04 03 01 5252525252552525252... │
+║ │ x ───────────────────┬── │
+║ └──┼─────────────────────────┼───┘
+║ │ │
+║ └▶ No checkpointer │
+║ No checkpointer data └────▶ Regular signature body
+║
+╚════════════▷ Recovery uses the checkpointer
+ that got at the start of the
+ chained signature
+```
+
+### Checkpointer control flow
+
+In summary, only the checkpointer that is defined by the wallet contract is used. If a non-chained signature is used, it has to either match the checkpointer's snapshot, or it must be behind the wallet contract.
+
+If a chained signature is used, then at some point during the chain, the snapshot provided by the checkpointer must match with one of the recovered configurations, this may also happen at the final signature. If this does not happen, the final signature (that corresponds to the wallet contract) **must** be ahead of the checkpointer's snapshot.
+
+```
+ ╔═══════════════════╗
+ ║ ║
+ ║ Validation ║
+ ║ start ║
+ ║ ║
+ ╚═════════╤═════════╝
+ │
+ │
+ │
+ ┌─────────▼─────────┐
+ │ │
+ │ Obtain snapshot │
+ │ │
+ │ │
+ └─────────┬─────────┘
+ │
+ │
+ │
+ ╔═══════════════════╗ ╭─────────▼─────────╮
+ ║ ║ │ Is snapshot │
+ ║ Approved by ║ Yes│ equal to │
+ ║ checkpointer ◀────────┤ bytes32(0)? │
+ ║ ║ │ │
+ ╚═══════════════════╝ ╰─────────┬─────────╯
+ │No
+ │
+ │
+ ╭─────────▼─────────╮
+ │ │
+ │ Is chained │ Yes
+ │ signature? ├────────────────╮
+ │ │ │
+ ╰─────────┬─────────╯ │
+ │No │
+ │ │
+ │ │
+ ╔═══════════════════╗ ┌─────────▼─────────┐ │
+ ║ ║ │ │ │
+ ║ Rejected by ║ │ Recover │ │
+ ║ checkpointer ║ │ image hash │ │
+ ║ ║ │ │ │
+ ╚═════════▲═════════╝ └─────────┬─────────┘ │
+ │ │ │
+ │ │ │
+ │No │ │
+ ╭─────────┴─────────╮ ╭─────────▼─────────╮ │
+ │ │ │ │ │
+ │ Checkpoint below │ No │ Matches │ │
+ │ snapshot? ◀────────┤ snapshot? │ │
+ │ │ │ │ │
+ ╰─────────┬─────────╯ ╰─────────┬─────────╯ │
+ │Yes │Yes │
+ │ │ │
+ │ │ │
+ │ ╔═════════▼═════════╗ │
+ │ ║ ║ │
+ │ ║ Approved by ║ │
+ └──────────────────▶ checkpointer ║ │
+ ║ ║ │
+ ╚═══════════════════╝ │
+ │
+ │
+ │
+ ┌───────────────▼───┐
+ │ │
+ │ Recover │
+ ┌──────────────────▶ image hash │
+ │ │ │
+ │ └─────────┬─────────┘
+ │ │
+ │ │
+ │No │
+ ╭─────────┴─────────╮ ╭─────────▼─────────╮
+ │ │ │ │
+ Yes│ Was the last │ No │ Matches │
+ ┌──────────────────┤ signature part? ◀────────┤ snapshot? │
+ │ │ │ │ │
+ │ ╰─────────▲─────────╯ ╰─────────┬─────────╯
+ │ │ │Yes
+ │ │ │
+ │ │ │
+╭─────────▼─────────╮ │ ┌─────────▼─────────┐
+│ │ │ │ │
+│ Was the snapshot │Yes │ │ Consume │
+│ consumed? ├─────────────┐ └──────────────────┤ snapshot │
+│ │ │ │ │
+╰─────────┬─────────╯ │ └───────────────────┘
+ │No │
+ │ │
+ │ │
+╭─────────▼─────────╮ ╔════▼══════════════╗
+│ │ ║ ║
+│ Last checkpoint │Yes ║ Approved by ║
+│ below snapshot? ├────────▶ checkpointer ║
+│ │ ║ ║
+╰─────────┬─────────╯ ╚═══════════════════╝
+ │No
+ │
+ │
+╔═════════▼═════════╗
+║ ║
+║ Rejected by ║
+║ checkpointer ║
+║ ║
+╚═══════════════════╝
+```
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/docs/CONFIGURATIONS.md b/lib/signals-implicit-mode/lib/sequence-v3/docs/CONFIGURATIONS.md
new file mode 100644
index 000000000..8d0c7d519
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/docs/CONFIGURATIONS.md
@@ -0,0 +1,279 @@
+# Sequence chained signatures
+
+This document provides a description on how the Sequence wallet contracts define and handle sets of signers, checkpoints, extensions and other parameters that fall within the scope of its "configuration".
+
+## **1. Overview**
+
+All Sequence wallets have a defined "configuration", this is the set of parameters that governs the wallet's behavior.
+
+The configuration includes:
+
+- The threshold needed to authorize a transaction.
+- The set of signers, and their corresponding weights.
+- The current "checkpoint", which determines the order of configuration updates.
+- Any "extensions" that are enabled, with their corresponding parameters.
+- The "checkpointer" contract, which acts as a connector for a keystore rollup.
+- Any pre-authorized transactions or messages, that are considered signed by the wallet.
+
+All these parameters are encoded into leaves of a merkle tree, of which the root is stored either as counter-factual information during wallet creation (as the salt of the `CREATE2` opcode), or directly within the contract storage; this "merkle root" is internally referred as the `imageHash` of the wallet.
+
+Since the wallet contract does not have direct access to the configuration, every time a signature is provided, the signature must provide both the "signature parts" that may be needed for the individual signers, as well as the "merkle proof" that allows the wallet contract to reconstruct the `imageHash` and thus validate the signature.
+
+## **2. Tree structure**
+
+The tree is a **sparse binary merkle tree**, this allows for more frequently accessed parameters to be stored closer to the root, making merkle proofs more efficient. Some elements like the `checkpointer`, `checkpoint` and `threshold` have fixed positions at the top of the tree, afterwards the other leaves can be arranged in any order.
+
+The top of the tree looks like:
+
+```
+imageHash = keccak256(
+ keccak256(
+ keccak256(
+ ...leaves,
+ threshold
+ ),
+ checkpoint
+ ),
+ checkpointer || address(0)
+)
+```
+
+The `checkpointer` is optional, if it is not provided it still has to be included in the merkle tree, it will be automatically set to `address(0)` if the signature flags do not set the `CHECKPOINTER` bit.
+
+```
+ ┌────────────────┐
+ │ │
+ │ Image hash │
+ │ │
+ └───▲────────▲───┘
+ │ │
+ ┌───┘ └────┐
+ │ ┌──────────┼───────────┐
+ ╭────┴───╮ │ ┌───────┴────────┐ │
+ │ │ │ │ │ ├────▶ This section is
+ │ │ │ │ Checkpointer │ │ always in the tree.
+ │ │ │ │ │ │
+ ╰─▲────▲─╯ │ └────────────────┘ │ It won't be shown
+ │ │ │ │ in the other diagrams.
+ │ └────┼──────────┐ │
+ │ │ │ │
+ ╭─┴──────╮ │ ┌───────┴────────┐ │
+ │ │ │ │ │ │
+ │ │ │ │ Checkpoint │ │
+ │ │ │ │ │ │
+ ╰─▲────▲─╯ │ └────────────────┘ │
+ │ │ │ │
+ │ └────┼──────────┐ │
+ │ │ │ │
+╔═════════╧══════╗ │ ┌───────┴────────┐ │
+║ ... rest ║ │ │ │ │
+║ of the tree ║ │ │ Threshold │ │
+║ ║ │ │ │ │
+╚════════════════╝ │ └────────────────┘ │
+ └──────────────────────┘
+```
+
+## **3. Leaf types**
+
+### 3.1 Signer leaf
+
+Signer leaves are used to specify signer addresses, meaning that when a valid signature is provided, the wallet will count their weight towards the threshold. Signer leaves do not specify if they are ERC1271 signers or not, instead this is determined when the signature is encoded.
+
+```
+ ┌────────────────┐
+ │ │
+ │ Image hash │
+ │ │
+ └───▲────────▲───┘
+ │ │
+ ┌───┘ └──────┐
+ │ │
+ ╭────┴───╮ ╔═════════╧═════════╗
+ │ │ ║Checkpointer: 0x ║
+ │ │ ║Checkpoint: 0 ║
+ │ │ ║Threshold: 1 ║
+ ╰─▲────▲─╯ ╚═══════════════════╝
+ │ │
+ ┌───────┘ └──────┐
+ │ │
+ │ │
+┌────────────────┐ ┌────────────────┐
+│ Signer 0xaaa │ │ Signer 0xbbb │
+│ Weight: 1 │ │ Weight: 1 │
+│ │ │ │
+└────────────────┘ └────────────────┘
+```
+
+The hash of a signer leaf is computed as:
+
+```
+leaf = keccak256(
+ "Sequence signer:\n",
+ address,
+ weight
+)
+```
+
+> Notice that any address that is registered **more than once** will be counted **multiple times** in the threshold.
+
+### 3.2 Hardcoded signature leaf
+
+Hardcoded signature leaves allow for the configuration to automatically sign a specific payload, this is useful for pre-approving transactions, for example pre-approving an approval for an ERC20 at the same time as the wallet is created.
+
+If a payload hash matches the hardcoded hash (subdigest), the weight counted towards the threshold will automatically be bumped to `type(uint256).max`, ensuring the signature to be valid.
+
+```
+ ┌────────────────┐
+ │ │
+ │ Image hash │
+ │ │
+ └───▲────────▲───┘
+ │ │
+ ┌───────┘ └────────┐
+ │ │
+┌───────┴────────┐ ╔═════════╧═════════╗
+│ Subdigest: │ ║Checkpointer: 0x ║
+│ 0x11223344 │ ║Checkpoint: 0 ║
+│ │ ║Threshold: 1 ║
+└────────────────┘ ╚═══════════════════╝
+```
+
+The hash of a hardcoded signature leaf is computed as:
+
+```
+leaf = keccak256(
+ "Sequence static digest:\n",
+ subdigest
+)
+```
+
+### 3.3 Any address hardcoded signature leaf
+
+This works very similarly to the hardcoded signature leaf, but the hash of the payload is computed setting its ERC712 domain separator to `address(0)` instead of the wallet's address.
+
+This allows for pre-approving transactions before the wallet has counterfactually been defined, otherwise attempting to compute the hash would require the wallet's address to be known beforehand, and determining the address would require the hash to be known beforehand, causing a recursive dependency.
+
+After a wallet is created, it is recommended to use the hardcoded signature leaf instead, as it is more efficient.
+
+The hash of an any address hardcoded signature leaf is computed as:
+
+```
+leaf = keccak256(
+ "Sequence any address subdigest:\n",
+ subdigest
+)
+```
+
+### 3.4 Nested configuration leaf
+
+Nested configuration leaves are used to specify nested configuration trees, this allows for certain sets of signers to be grouped in such a way that their signing power is limited by a threshold. It can also allow to augment the signing power of a set of signers, by making them have no signing power individually but still be able to sign as a group.
+
+They have their own internal thresholds, internally they work exactly as the parent "main" tree, but externally they can only contribute their own weight.
+
+```
+ ┌────────────────┐
+ │ │
+ │ Image hash │
+ │ │
+ └───▲────────▲───┘
+ │ │
+ ┌───┘ └──────┐
+ │ │
+ ╭────┴───╮ ╔═════════╧═════════╗
+ │ │ ║ Checkpointer: 0x ║
+ │ │ ║ Checkpoint: 0 ║
+ │ │ ║ Threshold: 2 ║
+ ╰─▲────▲─╯ ╚═══════════════════╝
+ │ │
+ ┌──────┘ └──────┐
+ │ │ ────┐
+┌──────────┴─────┐ ┌─────┴──────────┐ │
+│ Signer 0xaaa │ │ Threshold: 1 │ ├─▶ The maximum weight
+│ Weight: 1 │ │ Weight: 1 │ │ of 0xbbb and 0xccc
+│ │ │ │ │ can't exceed 1
+└────────────────┘ └─────▲────▲─────┘ │
+ │ │ │ Forced either of
+ ┌──────┘ └──────┐ │ them to be combined
+ │ │ │ with 0xaaa
+ ┌──────────┴─────┐ ┌─────┴──────────┐ │
+ │ Signer: 0xbbb │ │ Signer 0xccc │ │
+ │ Weight: 1 │ │ Weight: 2 │ │
+ │ │ │ │ │
+ └────────────────┘ └────────────────┘ │
+ ────┘
+```
+
+The hash of a nested tree is computed as:
+
+```
+leaf = keccak256(
+ "Sequence nested config:\n",
+ node,
+ threshold,
+ weight
+)
+```
+
+### 3.5 Sapient Signer Leaf
+
+Sapient signer leaves work similarly to Signer leaves, but have 3 key distinctions:
+
+1. Sapient signers **must** always be smart contracts, EOA signers are not allowed
+2. Sapient signers **do not** use the ERC1271 interface, instead they get passed a fully decoded `Payload` to sign
+3. Sapient signatures are not validated, they are **recovered** into a hash
+
+When a sapient signer leaf is added to a configuration, it must define its `address`, `weight` and `imageHash`. The `imageHash` represents the expected value that the sapient signer **must recover** for the signature to be valid.
+
+This allows sapient signers to act as **extensions** of the configuration tree, they can define their own leaf types and overall structures, alongside arbitrary logic. This allows for extensions to be configured per wallet without having to rely on the contract storage of the extension, as the definition of the configuration resides in the same `imageHash`.
+
+```
+ ┌────────────────┐
+ │ │
+ │ Image hash │
+ │ │
+ └───▲────────▲───┘
+ │ │
+ ┌───┘ └──────┐
+ │ │
+ ╭────┴───╮ ╔═════════╧═════════╗
+ │ │ ║ Checkpointer: 0x ║
+ │ │ ║ Checkpoint: 0 ║
+ │ │ ║ Threshold: 2 ║
+ ╰─▲────▲─╯ ╚═══════════════════╝
+ │ │
+ ┌──────┘ └──────┐
+ │ │ ────┐
+ ┌──────────┴─────┐ ┌─────┴──────────┐ ├─▶ The passkey sapient
+ │ Signer 0xaaa │ │ Passkey │ │ signer uses its tree
+ │ Weight: 1 │ │ weight: 1 │ │ to define public
+ │ │ │imageHash: 0xabc│ │ keys and
+ └────────────────┘ └─────▲────▲─────┘ │ configuration
+ │ │ │ parameters.
+ ┌───────────────┘ └───────────────┐ │
+ │ │ │ Signatures must be
+ ╭─────┴──╮ ╭──┴─────╮ │ able to recover the
+ │ │ │ │ │ inner root of the
+ │ │ │ │ │ tree to be
+ │ │ │ │ │ considered valid.
+ ╰─▲────▲─╯ ╰─▲────▲─╯ │
+ │ │ │ │ │
+ ┌──────┘ └──────┐ ┌──────┘ └──────┐ │
+ │ │ │ │ │
+┌────────┴───────┐ ┌───────┴────────┐ ┌────────┴───────┐ ┌───────┴────────┐ │
+│ │ │ │ │ Require user │ │ │ │
+│ Pubkey X │ │ Pubkey Y │ │ verification │ │ Metadata │ │
+│ │ │ │ │ true/false │ │ │ │
+└────────────────┘ └────────────────┘ └────────────────┘ └────────────────┘ │
+ ────┘
+```
+
+The hash of a sapient signer leaf is:
+
+```
+leaf = keccak256(
+ "Sequence sapient config:\n",
+ address,
+ weight,
+ imageHash
+)
+```
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/docs/PAYLOAD.md b/lib/signals-implicit-mode/lib/sequence-v3/docs/PAYLOAD.md
new file mode 100644
index 000000000..61d71e55f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/docs/PAYLOAD.md
@@ -0,0 +1,392 @@
+# Sequence Payload System Documentation
+
+This document provides a comprehensive overview of how the Sequence wallet contracts encode, decode, and execute payloads. It explains the payload structure, encoding schemes, execution flow, and how payloads integrate with the broader signature and configuration systems.
+
+---
+
+## **1. Overview**
+
+The Sequence payload system is the core mechanism through which wallets execute batched operations. Payloads are encoded data structures that contain:
+
+- **Transaction calls** with target addresses, values, and calldata
+- **Configuration updates** for wallet parameters
+- **Message validations** for arbitrary data signing
+- **Digest verifications** for ERC-1271 compatibility
+
+Payloads are designed to be:
+
+1. **Gas-efficient** through compact binary encoding
+2. **Flexible** to support various operation types
+3. **Secure** through EIP-712 structured hashing
+4. **Batchable** to execute multiple operations atomically
+
+---
+
+## **2. Payload Types**
+
+The system supports four distinct payload kinds, each serving different purposes:
+
+### **2.1 Transaction Payloads (`KIND_TRANSACTIONS = 0x00`)**
+
+Transaction payloads contain batched calls to external contracts or self-execution logic. These are the most common payload type and support:
+
+- Multiple contract calls in sequence
+- Value transfers with calls
+- Delegate calls for extension execution
+- Gas limit specifications
+- Error handling behaviors
+- Fallback-only execution modes
+
+### **2.2 Message Payloads (`KIND_MESSAGE = 0x01`)**
+
+Message payloads allow wallets to sign arbitrary data for off-chain verification. This is useful for:
+
+- Meta-transactions
+- Off-chain authorization
+- Cross-chain message signing
+- General-purpose data signing
+
+### **2.3 Configuration Update Payloads (`KIND_CONFIG_UPDATE = 0x02`)**
+
+Configuration update payloads enable wallet reconfiguration through:
+
+- Signer set modifications
+- Threshold adjustments
+- Extension enablement/disablement
+- Checkpoint updates
+
+### **2.4 Digest Payloads (`KIND_DIGEST = 0x03`)**
+
+Digest payloads provide ERC-1271 compatibility by allowing wallets to validate pre-computed message hashes.
+
+---
+
+## **3. Payload Structure**
+
+### **3.1 Core Payload Structure**
+
+All payloads share a common structure defined by the `Decoded` struct:
+
+```solidity
+struct Decoded {
+ uint8 kind; // Payload type identifier
+ bool noChainId; // Chain ID inclusion flag
+ // Transaction-specific fields
+ Call[] calls; // Array of call operations
+ uint256 space; // Nonce space identifier
+ uint256 nonce; // Nonce value for replay protection
+ // Message-specific fields
+ bytes message; // Raw message data
+ // Configuration-specific fields
+ bytes32 imageHash; // New configuration hash
+ // Digest-specific fields
+ bytes32 digest; // Pre-computed message hash
+ // Common fields
+ address[] parentWallets; // Parent wallet addresses
+}
+```
+
+### **3.2 Call Structure**
+
+Individual calls within transaction payloads are defined by the `Call` struct:
+
+```solidity
+struct Call {
+ address to; // Target contract address
+ uint256 value; // ETH value to send
+ bytes data; // Calldata for the call
+ uint256 gasLimit; // Gas limit for execution
+ bool delegateCall; // Delegate call flag
+ bool onlyFallback; // Fallback-only execution
+ uint256 behaviorOnError; // Error handling strategy
+}
+```
+
+---
+
+## **4. Payload Encoding**
+
+### **4.1 Transaction Payload Encoding**
+
+Transaction payloads use a compact binary encoding scheme optimized for gas efficiency. The encoding follows this structure:
+
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│ Global Flag (1 byte) │
+│ ┌─────────────────────────────────────────────────────────────────────────┐ │
+│ │ Bit 0: Space flag (0 = read space, 1 = space is 0) │ │
+│ │ Bits 1-3: Nonce size (0-7 bytes) │ │
+│ │ Bit 4: Single call flag (0 = multiple calls, 1 = single call) │ │
+│ │ Bit 5: Call count size (0 = 1 byte, 1 = 2 bytes) │ │
+│ │ Bits 6-7: Reserved │ │
+│ └─────────────────────────────────────────────────────────────────────────┘ │
+├─────────────────────────────────────────────────────────────────────────────┤
+│ Space (0 or 20 bytes) - only if space flag is 0 │
+├─────────────────────────────────────────────────────────────────────────────┤
+│ Nonce (0-7 bytes) - size determined by bits 1-3 │
+├─────────────────────────────────────────────────────────────────────────────┤
+│ Call Count (1-2 bytes) - size determined by bit 5 │
+├─────────────────────────────────────────────────────────────────────────────┤
+│ Call Array (call count length) │
+│ ┌─────────────────────────────────────────────────────────────────────────┐ │
+│ │ Call Flags (1 byte) │ │
+│ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │
+│ │ │ Bit 0: Self-call flag (0 = external, 1 = self) │ │ │
+│ │ │ Bit 1: Value flag (0 = no value, 1 = has value) │ │ │
+│ │ │ Bit 2: Data flag (0 = no data, 1 = has data) │ │ │
+│ │ │ Bit 3: Gas limit flag (0 = no limit, 1 = has limit) │ │ │
+│ │ │ Bit 4: Delegate call flag │ │ │
+│ │ │ Bit 5: Fallback-only flag │ │ │
+│ │ │ Bits 6-7: Behavior on error (00=ignore, 01=revert, 10=abort) │ │ │
+│ │ └─────────────────────────────────────────────────────────────────────┘ │ │
+│ ├─────────────────────────────────────────────────────────────────────────┤ │
+│ │ Target Address (0 or 20 bytes) - only if not self-call │ │
+│ ├─────────────────────────────────────────────────────────────────────────┤ │
+│ │ Value (0 or 32 bytes) - only if value flag is set │ │
+│ ├─────────────────────────────────────────────────────────────────────────┤ │
+│ │ Data Size (0 or 3 bytes) - only if data flag is set │ │
+│ ├─────────────────────────────────────────────────────────────────────────┤ │
+│ │ Data (0 or N bytes) - only if data flag is set │ │
+│ ├─────────────────────────────────────────────────────────────────────────┤ │
+│ │ Gas Limit (0 or 32 bytes) - only if gas limit flag is set │ │
+│ └─────────────────────────────────────────────────────────────────────────┘ │
+└─────────────────────────────────────────────────────────────────────────────┘
+```
+
+### **4.2 Global Flag Breakdown**
+
+The global flag byte controls the overall payload structure:
+
+```
+Global Flag: [7][6][5][4][3][2][1][0]
+ │ │ │ │ │ │ │ └── [0] Space flag
+ │ │ │ │ │ │ └───── [1][0] Nonce size
+ │ │ │ │ │ └──────── [2][1] Nonce size
+ │ │ │ │ └─────────── [3][2] Nonce size
+ │ │ │ └────────────── [4] Single call flag
+ │ │ └───────────────── [5] Call count size
+ │ └──────────────────── [6] Reserved
+ └─────────────────────── [7] Reserved
+```
+
+**Space Flag (Bit 0):**
+
+- `0`: Read 20-byte space address from payload
+- `1`: Set space to 0 (default space)
+
+**Nonce Size (Bits 1-3):**
+
+- `000`: No nonce (nonce = 0)
+- `001`: 1-byte nonce
+- `010`: 2-byte nonce
+- `011`: 3-byte nonce
+- `100`: 4-byte nonce
+- `101`: 5-byte nonce
+- `110`: 6-byte nonce
+- `111`: 7-byte nonce
+
+**Single Call Flag (Bit 4):**
+
+- `0`: Multiple calls (read call count)
+- `1`: Single call (call count = 1)
+
+**Call Count Size (Bit 5):**
+
+- `0`: Call count stored in 1 byte
+- `1`: Call count stored in 2 bytes
+
+### **4.3 Call Flags Breakdown**
+
+Each call begins with a flags byte that controls its execution parameters:
+
+```
+Call Flags: [7][6][5][4][3][2][1][0]
+ │ │ │ │ │ │ │ └─── [0] Self-call flag
+ │ │ │ │ │ │ └────── [1] Value flag
+ │ │ │ │ │ └───────── [2] Data flag
+ │ │ │ │ └──────────── [3] Gas limit flag
+ │ │ │ └─────────────── [4] Delegate call flag
+ │ │ └────────────────── [5] Fallback-only flag
+ │ └───────────────────── [6][0] Behavior on error
+ └──────────────────────── [7][1] Behavior on error
+```
+
+**Self-call Flag (Bit 0):**
+
+- `0`: External call (read target address)
+- `1`: Self-call (target = address(this))
+
+**Value Flag (Bit 1):**
+
+- `0`: No ETH value
+- `1`: Read 32-byte value from payload
+
+**Data Flag (Bit 2):**
+
+- `0`: No calldata
+- `1`: Read 3-byte data size + N bytes of data
+
+**Gas Limit Flag (Bit 3):**
+
+- `0`: Use remaining gas
+- `1`: Read 32-byte gas limit from payload
+
+**Delegate Call Flag (Bit 4):**
+
+- `0`: Regular call
+- `1`: Delegate call
+
+**Fallback-only Flag (Bit 5):**
+
+- `0`: Execute normally
+- `1`: Only execute if previous call failed
+
+**Behavior on Error (Bits 6-7):**
+
+- `00`: Ignore error, continue execution
+- `01`: Revert entire transaction
+- `10`: Abort execution, stop processing
+- `11`: Reserved
+
+---
+
+## **5. Payload Execution**
+
+### **5.1 Execution Flow**
+
+The payload execution follows this sequence:
+
+1. **Decode Payload**: Parse the binary payload into structured data
+2. **Nonce Validation**: Consume the nonce to prevent replay attacks
+3. **Signature Verification**: Validate the signature against the payload
+4. **Call Execution**: Execute each call in sequence
+5. **Error Handling**: Apply error handling based on call configuration
+
+### **5.2 Call Execution Modes**
+
+#### **Regular Calls**
+
+Standard contract calls that execute with the specified parameters and return control to the wallet.
+
+#### **Delegate Calls**
+
+Execute code in the context of the wallet contract, allowing extensions to modify wallet state.
+
+#### **Fallback-only Calls**
+
+Only execute when the immediately preceding call fails (and has the `BEHAVIOR_IGNORE_ERROR` behavior), enabling conditional execution flows. See Error Handling Strategies below.
+
+### **5.3 Error Handling Strategies**
+
+The system provides three error handling behaviors:
+
+1. **Ignore Error (`BEHAVIOR_IGNORE_ERROR`)**
+ - Continue execution with subsequent calls
+ - Set error flag for fallback-only calls
+ - Emit `CallFailed` event
+
+2. **Revert on Error (`BEHAVIOR_REVERT_ON_ERROR`)**
+ - Revert entire transaction
+ - Rollback all state changes
+ - Emit `Reverted` error
+
+3. **Abort on Error (`BEHAVIOR_ABORT_ON_ERROR`)**
+ - Stop processing remaining calls
+ - Keep successful call results
+ - Emit `CallAborted` event
+
+---
+
+## **6. EIP-712 Integration**
+
+### **6.1 Domain Separator**
+
+Payloads use EIP-712 for structured hashing with the domain:
+
+```
+EIP712Domain(
+ name: "Sequence Wallet"
+ version: "3"
+ chainId: block.chainid (or 0 if noChainId)
+ verifyingContract: wallet address
+)
+```
+
+### **6.2 Type Hashes**
+
+Each payload type has a specific type hash:
+
+- **Calls**: `keccak256("Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)")`
+- **Message**: `keccak256("Message(bytes message,address[] wallets)")`
+- **ConfigUpdate**: `keccak256("ConfigUpdate(bytes32 imageHash,address[] wallets)")`
+
+### **6.3 Call Hashing**
+
+Individual calls are hashed using:
+
+```
+keccak256(
+ CALL_TYPEHASH,
+ to,
+ value,
+ keccak256(data),
+ gasLimit,
+ delegateCall,
+ onlyFallback,
+ behaviorOnError
+)
+```
+
+---
+
+## **7. Gas Optimization Features**
+
+### **7.1 Compact Encoding**
+
+The payload system uses several techniques to minimize gas costs:
+
+- **Flag-based encoding**: Single bytes control multiple parameters
+- **Variable-length fields**: Only encode necessary data
+- **Self-call optimization**: Avoid 20-byte address encoding for self-calls
+- **Conditional encoding**: Skip fields that have default values
+
+### **7.2 Batch Processing**
+
+Multiple calls can be executed in a single transaction, reducing:
+
+- Transaction overhead
+- Gas costs for multiple operations
+- Network congestion
+- User interaction requirements
+
+---
+
+## **8. Security Considerations**
+
+### **8.1 Replay Protection**
+
+- **Nonce system**: Each payload requires a unique nonce
+- **Space isolation**: Different nonce spaces prevent cross-contamination
+- **Chain ID binding**: Prevents cross-chain replay attacks
+
+### **8.2 Access Control**
+
+- **Signature validation**: All payloads require valid signatures
+- **Configuration binding**: Payloads are tied to specific wallet configurations
+- **Extension isolation**: Delegate calls are restricted to approved extensions
+
+### **8.3 Error Handling**
+
+- **Graceful degradation**: Failed calls don't necessarily fail the entire batch
+- **Gas protection**: Individual gas limits prevent infinite loops
+- **State consistency**: Error behaviors maintain wallet integrity
+
+---
+
+## **Conclusion**
+
+The Sequence payload system provides a powerful, gas-efficient mechanism for executing complex wallet operations. Through its compact binary encoding, flexible call structures, and comprehensive error handling, it enables wallets to perform sophisticated multi-step operations while maintaining security and efficiency.
+
+The system's integration with the broader Sequence ecosystem—including chained signatures, smart sessions, and configuration management—creates a cohesive framework for advanced wallet functionality. The payload system serves as the execution engine that brings together all these components into a unified user experience.
+
+This documentation serves as a technical reference for developers implementing and extending the payload system, providing both high-level architectural understanding and detailed implementation guidance.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/docs/SESSIONS.md b/lib/signals-implicit-mode/lib/sequence-v3/docs/SESSIONS.md
new file mode 100644
index 000000000..b764bd190
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/docs/SESSIONS.md
@@ -0,0 +1,502 @@
+# Ecosystem Wallets Smart Sessions Documentation
+
+This document provides an in-depth overview of the smart sessions system in Ecosystem wallets. It explains the encoding of signatures and configurations, details the permissions system, and distinguishes between explicit sessions and implicit sessions.
+
+---
+
+## Overview
+
+Ecosystem wallets smart sessions enable batched call authorization via signed payloads. Two primary session modes are supported:
+
+- **Explicit Sessions:**
+ Explicit sessions are part of the wallet's configuration. Their permissions are granted counter factually - derived from signature calldata. These permissions can be added or removed with a configuration update. As the configuration is tied to the wallet's image hash, any change to the wallet (and thus its image hash) immediately affects which explicit session permissions remain valid.
+
+- **Implicit Sessions:**
+ Implicit sessions are automatically able to sign on behalf of the wallet when they present an attestation that is signed by the wallet's identity signer. This mode leverages off-chain attestations and enforces additional constraints (e.g., blacklisting) to protect against misuse.
+
+---
+
+## Signature Encoding
+
+Signature encoding consists of **three** main parts:
+
+1. **Session Configuration Encoding**
+2. **Attestation List Encoding**
+3. **Call Signatures Encoding**
+
+Each part uses a specific layout and bit-level structure to efficiently encode the required data.
+
+---
+
+### 1. Session Configuration Encoding
+
+The session configuration is embedded within the signature as follows:
+
+```
+┌─────────────────────────────────────────────────────┐
+│ uint24 dataSize │
+│ ┌───────────────────────────────────────────────┐ │
+│ │ Session Configuration Bytes (dataSize bytes) │ │
+│ └───────────────────────────────────────────────┘ │
+└─────────────────────────────────────────────────────┘
+```
+
+Within these configuration bytes, the data is structured as a series of tagged nodes. Each node begins with a flag byte that indicates the node type and any associated metadata.
+
+#### Flag Byte Structure
+
+```
+ ┌───────────────────────────────┐
+ │ Bits 7..4: FLAG │ (Identifies the node type)
+ │ Bits 3..0: Additional Data │ (Depends on the FLAG)
+ └───────────────────────────────┘
+```
+
+The following flags are defined:
+
+- **0x00: Permissions Node**
+- **0x01: Node (Pre-hashed 32-byte value)**
+- **0x02: Branch (Nested encoding)**
+- **0x03: Blacklist**
+- **0x04: Identity Signer**
+
+> [!IMPORTANT]
+> There must be exactly **one** Identity Signer and at most one Blacklist node. Multiple entries will trigger a validation error. If there are any implicit sessions (attestations), a blacklist is mandatory.
+
+#### Permissions Node (FLAG 0x00)
+
+This node encodes session permissions for a specific signer:
+
+```
+Permissions Node Layout:
+ ┌─────────────────────────────────────────────┐
+ │ Flag Byte │
+ │ ┌────────────────────────┐ │
+ │ │ Bits 7..4: FLAG (0x00) │ │
+ │ │ Bits 3..0: Unused │ │
+ │ └────────────────────────┘ │
+ │ Signer (address) │
+ │ Value Limit (uint256) │
+ │ Deadline (uint256) │
+ │ Permissions Array (encoded permissions) │
+ └─────────────────────────────────────────────┘
+```
+
+##### Permission Object Encoding
+
+Each permission object is structured as follows:
+
+```
+Permission Encoding:
+ ┌─────────────────────────────┐
+ │ Target Address │
+ │ Rules Count (uint8) │
+ │ ┌─────────────────────────┐ │
+ │ │ Parameter Rule 1 │ │
+ │ │ Parameter Rule 2 │ │ ... (if any)
+ │ └─────────────────────────┘ │
+ └─────────────────────────────┘
+```
+
+If the **Rules Count** is zero, the permission is considered _open_, allowing any call that targets the specified address without additional parameter restrictions.
+
+##### Parameter Rule Encoding
+
+Each parameter rule enforces conditions on the call data:
+
+```
+Parameter Rule Encoding:
+ ┌──────────────────────────────────────────────────────────────┐
+ │ Operation & Cumulative Flag (1 byte) │
+ │ ┌────────────────────────────────────────────────────────┐ │
+ │ │ Bits 7..1 (0xFE): Operation (e.g., 0 = EQUAL, etc.) │ │
+ │ │ Bit 0 (0x01): Cumulative flag (1 = cumulative) │ │
+ │ └────────────────────────────────────────────────────────┘ │
+ │ Value (bytes32) │
+ │ Offset (uint256) │
+ │ Mask (bytes32) │
+ └──────────────────────────────────────────────────────────────┘
+```
+
+> [!TIP]
+> A permission with an empty rules array is treated as _open_, granting unrestricted access to the target, subject only to other constraints such as value limits and deadlines.
+
+#### Node (FLAG 0x01)
+
+This node includes a 32-byte pre-hashed value:
+
+```
+Node Layout:
+ ┌──────────────────────────────┐
+ │ Flag Byte │
+ │ ┌────────────────────────┐ │
+ │ │ Bits 7..4: FLAG (0x01) │ │
+ │ │ Bits 3..0: Unused │ │
+ │ └────────────────────────┘ │
+ │ Node Hash (bytes32) │
+ └──────────────────────────────┘
+```
+
+This node is an optimization to reduce the size of the configuration tree in calldata. By using this node, unused permissions or configuration segments can be hidden, while still allowing the complete image hash to be derived.
+
+#### Branch (FLAG 0x02)
+
+Branches allow for the recursive grouping of nested configuration nodes into a single unit. They are used to bundle together multiple nodes - such as several permissions nodes or even other branch nodes - so that the entire collection can be processed as one entity. This design minimizes redundancy and optimizes the calldata size by avoiding repeated encoding of common structures.
+
+```
+Branch Node Layout:
+ ┌──────────────────────────────────────────────┐
+ │ Flag Byte │
+ │ ┌────────────────────────────────────────┐ │
+ │ │ Bits 7..4: FLAG (0x02) │ │
+ │ │ Bits 3..0: Size of size field in bytes │ │
+ │ └────────────────────────────────────────┘ │
+ │ Size (uintX, where X is determined above) │
+ │ Branch Data (nested configuration bytes) │
+ └──────────────────────────────────────────────┘
+```
+
+The **Size** field specifies the total number of bytes that the branch occupies. The size of this field is determined by the additional data portion of the flag byte (bits 3..0), which indicates how many bytes are used to encode the size. The branch data that follows can include a mix of permissions nodes, pre-hashed nodes, blacklists, and even other branches. When processing a branch:
+
+- The branch data is parsed recursively, with each nested node being processed according to its own flag.
+- The leaf hashes of all nested nodes are computed.
+- These individual hashes are then combined (e.g., using `LibOptim.fkeccak256`) to produce a single cumulative hash representing the entire branch.
+- This branch hash is then integrated into the parent configuration's image hash, ensuring that all the nested information contributes to the final cryptographic fingerprint.
+
+> [!TIP]
+> Branch nodes are especially useful for modularizing the configuration structure. They allow logically related nodes to be grouped together, which not only improves organization but also potentially reduces the overall size of the calldata by allowing unused leaves to be rolled up into a single node.
+
+#### Blacklist (FLAG 0x03)
+
+The blacklist node specifies addresses that are disallowed for implicit sessions. This includes both target addresses that cannot be called and session signers that are not allowed to make implicit calls.
+
+```
+Blacklist Node Layout:
+ ┌──────────────────────────────────────────────┐
+ │ Flag Byte │
+ │ ┌────────────────────────────────────────┐ │
+ │ │ Bits 7..4: FLAG (0x03) │ │
+ │ │ Bits 3..0: Blacklist count or 0x0F │ │
+ │ └────────────────────────────────────────┘ │
+ │ [Optional] Extended Count (uint16) │
+ │ Blacklisted Addresses (sorted array) │
+ └──────────────────────────────────────────────┘
+```
+
+The blacklist count is encoded in the additional data portion of the flag byte (bits 3..0):
+
+- If the count is 14 or less, it is stored directly in these bits
+- If the count is 15 or more, these bits are set to 0x0F and the actual count is stored in the next 2 bytes as a uint16
+
+The blacklist serves two security purposes:
+
+1. Prevents implicit sessions from calling specific target addresses
+2. Blocks specific session signers from making any implicit calls
+
+When an implicit session call is made, both the session signer and the target address are checked against the blacklist. If either appears in the blacklist, the call will be rejected with a `BlacklistedAddress` error.
+
+> [!IMPORTANT]
+> For implicit sessions, the blacklist is mandatory. The blacklist addresses must be sorted or validation will fail. This is to allow a binary search during validation.
+
+> [!WARNING]
+> The blacklist doesn't not prevent explicit sessions from calling blacklisted addresses or prevent explicit signers. To block an explicit session or it's permissions, update the wallet configuration to remove the explicit session.
+
+#### Identity Signer (FLAG 0x04)
+
+Specifies the identity signer used for attestation verification:
+
+```
+Identity Signer Layout:
+ ┌──────────────────────────────┐
+ │ Flag Byte │
+ │ ┌────────────────────────┐ │
+ │ │ Bits 7..4: FLAG (0x04) │ │
+ │ │ Bits 3..0: Unused │ │
+ │ └────────────────────────┘ │
+ │ Identity Signer (address) │
+ └──────────────────────────────┘
+```
+
+> [!IMPORTANT]
+> The configuration must include exactly one identity signer. Duplicate or missing entries trigger an error.
+
+---
+
+### 2. Attestation List Encoding
+
+After reading the session configuration, a single byte `attestationCount` indicates how many attestations follow:
+
+```
+┌─────────────────────────────────────────────────────┐
+│ uint8 attestationCount │
+│ ┌────────────────────────────────────────────────┐ │
+│ │ Attestation + identity signature │ │
+│ │ ... repeated attestationCount times ... │ │
+│ └────────────────────────────────────────────────┘ │
+└─────────────────────────────────────────────────────┘
+```
+
+Each attestation is encoded as described in [Attestation (Implicit Sessions)](#attestation-implicit-sessions) below, then followed by a single identity signature from the configured identity signer (in EIP-2098 compact form).
+
+If `attestationCount > 0` but no blacklist node was present in the configuration, validation fails.
+
+---
+
+### 3. Call Signatures Encoding
+
+Each call in the payload is accompanied by a call signature. The encoding differs slightly for explicit sessions and implicit sessions.
+
+#### Call Signature Structure
+
+```
+Call Signature Layout:
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Flag Byte │
+ │ ┌────────────────────────────────────────────────────────┐│
+ │ │ Bit 7 (0x80): isImplicit flag ││
+ │ │ Bits 6..0 (0x7F): If implicit, this is the attestation ││
+ │ │ index; if explicit, this is the ││
+ │ │ session permission index ││
+ │ └────────────────────────────────────────────────────────┘│
+ │ Session Signature (EIP-2098 compact: see below) │
+ └─────────────────────────────────────────────────────────────┘
+```
+
+> [!IMPORTANT]
+> The flag byte is critical for distinguishing call types. For implicit sessions, the most significant bit (Bit 7) must be set. For explicit sessions, the lower 7 bits represent the permission index.
+
+The session signature is an ECDSA signature of the call and replay protection information in the payload (nonce, space and chainId).
+
+No attestation data is embedded here for implicit calls; instead, each implicit call references an attestation by index from the Attestation List.
+
+#### EIP-2098 Compact Signature Encoding
+
+Compact signatures follows the [EIP-2098](https://eip.tools/eip/2098) compact signature format. In this format, the signature is encoded as follows:
+
+```
+EIP-2098 Compact Encoding:
+ ┌─────────────────────────────────────────────────────────────┐
+ │ 256-bit r value │
+ │ 1-bit yParity (encoded into s) │
+ │ 255-bit s value │
+ └─────────────────────────────────────────────────────────────┘
+```
+
+This encoding merges the `v` value into the `s` value, reducing the overall signature size while maintaining full signature recovery capability.
+
+---
+
+## Permissions System
+
+The permissions system governs what actions a session signer is allowed to execute within explicit sessions. It is designed to be flexible, allowing validations on any field within the call data through the use of **value**, **offset**, and **mask** parameters.
+
+### Session Permissions (Explicit Sessions)
+
+Defined in the `SessionPermissions` struct, these include:
+
+- **Signer:** Authorized session signer.
+- **Value Limit:** Maximum native token value allowed.
+- **Deadline:** Expiration timestamp (0 indicates no deadline).
+- **Permissions Array:** List of permission objects.
+
+> [!WARNING]
+> If a session's deadline is set and the current block timestamp exceeds it, the session is considered expired and all calls will be rejected.
+
+### Permission Object and Parameter Rules
+
+Each permission object specifies a target contract and a set of rules that define acceptable call parameters.
+
+#### Permission Object Recap
+
+```
+Permission Object:
+ ┌────────────────────────────────┐
+ │ Target Address │
+ │ Rules Count (uint8) │
+ │ Rules (array of ParameterRule) │
+ └────────────────────────────────┘
+```
+
+#### Parameter Rule Recap
+
+```
+Parameter Rule:
+ ┌────────────────────────────────────────────────────────────┐
+ │ Operation & Cumulative Flag (1 byte) │
+ │ ┌──────────────────────────────────────────────────────┐ │
+ │ │ Bits 7..1 (0xFE): Operation (e.g., 0 = EQUAL, etc.) │ │
+ │ │ Bit 0 (0x01): Cumulative flag (1 = cumulative) │ │
+ │ └──────────────────────────────────────────────────────┘ │
+ │ Value (bytes32) │
+ │ Offset (uint256) │
+ │ Mask (bytes32) │
+ └────────────────────────────────────────────────────────────┘
+```
+
+> [!TIP]
+> A permission with an empty rules array is treated as _open_, granting unrestricted access to the target, subject only to other constraints such as value limits and deadlines.
+
+---
+
+## Detailed Permission Rules and Validation
+
+The permission rules mechanism provides a powerful and flexible method to validate any field within the call data. Here's a detailed look at how the rules work:
+
+### Components of a Permission Rule
+
+- **Value:**
+ The expected value (stored as a `bytes32`) used for comparison.
+
+- **Offset:**
+ The byte offset in the call data from which the 32-byte parameter is extracted.
+
+- **Mask:**
+ A bitmask applied to the extracted data. This isolates the relevant bits, allowing validation even when the field is embedded within a larger data structure.
+
+### Validation Process
+
+For each rule, the validation function performs the following steps:
+
+1. **Extraction:**
+ Read 32 bytes from the call data starting at the specified offset:
+
+ ```solidity
+ bytes32 extracted_value = call.data.readBytes32(rule.offset);
+ ```
+
+2. **Masking:**
+ Apply the mask to isolate the target bits:
+
+ ```solidity
+ bytes32 masked_value = extracted_value & rule.mask;
+ ```
+
+3. **Comparison:**
+ Compare the masked value with the expected value using the defined operation:
+ - **EQUAL:** The masked value must exactly equal the expected value.
+ - **LESS_THAN_OR_EQUAL:** The masked value must be less than or equal to the expected value.
+ - **GREATER_THAN_OR_EQUAL:** The masked value must be greater than or equal to the expected value.
+ - **NOT_EQUAL:** The masked value must not equal the expected value.
+
+> [!TIP]
+> This approach allows validation on any field within the call data regardless of its format or position.
+
+### The Cumulative Flag
+
+When the **cumulative** flag is set on a permission rule:
+
+1. **Cumulative Calculation:**
+ The value extracted from the current call is added to a previously recorded usage amount (stored in the payload's usage limits or persistent storage).
+
+2. **Threshold Comparison:**
+ The cumulative total (current value plus previous usage) is compared against the threshold defined by the rule.
+
+3. **Preceding Update:**
+ Because cumulative values persist across multiple calls, a preceding call to `incrementUsageLimit` is required. This call updates the on-chain storage with the new cumulative total, ensuring that future validations reflect the updated usage.
+
+> [!WARNING]
+> Cumulative usage is tracked using hashes: `keccak256(abi.encode(signer, permission, ruleIdx))` for rules and `keccak256(abi.encode(signer, VALUE_TRACKING_ADDRESS))` for native tokens. Modifying a permission creates a new hash, so the old usage state must be considered when modifying a permission.
+
+### Example: ERC20.transfer
+
+Consider an ERC20 token `transfer` function:
+
+```solidity
+function transfer(address to, uint256 amount) returns (bool);
+```
+
+**Call Data Layout:**
+
+- **4 bytes:** Function selector.
+- **32 bytes:** Encoded `to` address.
+- **32 bytes:** Encoded `amount`.
+
+**Permission Rule Setup:**
+
+- **Target:**
+ The ERC20 token contract address.
+
+- **Offset:**
+ `36` bytes (4 bytes for the function selector + 32 bytes for the `to` address) - this is where the `amount` parameter begins.
+
+- **Mask:**
+ A full mask (`0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF`) to extract the entire 32-byte value.
+
+- **Value:**
+ `100 * 10^18` (expressed as a `bytes32` value) to represent a maximum transfer amount of 100 tokens (assuming 18 decimals).
+
+- **Operation:**
+ `LESS_THAN_OR_EQUAL` - ensuring the transfer amount does not exceed the threshold.
+
+- **Cumulative Flag (optional):**
+ If you want to enforce a cumulative limit (e.g., a daily cap), set the cumulative flag. Each transfer's amount is then added to a cumulative total that must not exceed the threshold, with an `incrementUsageLimit` call required to update the stored value.
+
+> [!NOTE]
+> ERC20.transfer Example Recap: The permission rule extracts the `amount` parameter from call data at offset 36, applies a mask to isolate the full value, and verifies that the value is less than or equal to 100 \* 10^18. Optionally, if the cumulative flag is set, it enforces a cumulative limit across multiple calls. In practice, the permission would also include a rule to check the function selector, ensuring that the call is to the `transfer` function.
+
+---
+
+## Attestation (Implicit Sessions)
+
+Implicit sessions use an attestation to verify that the session signer is approved. The attestation is encoded and then validated by the target contract.
+
+### Attestation Encoding
+
+```
+Attestation Encoding:
+ ┌──────────────────────────────────────────────┐
+ │ Approved Signer (address) │
+ │ Identity Type (bytes4) │
+ │ Issuer Hash (bytes32) │
+ │ Audience Hash (bytes32) │
+ │ Application Data Length (uint24) │
+ │ Application Data (variable bytes) │
+ │ Redirect URL Length (uint24) │
+ │ Redirect URL (variable string) │
+ │ Issued At (uint64) │
+ └──────────────────────────────────────────────┘
+```
+
+The Attestation data obtained during authentication. The `Identity Type` is the type of identity that was used to authenticate the user. The `Issuer Hash` is the hash of the issuer. The `Audience Hash` is the hash of the audience. The `Application Data` can be provided by the dapp. The `Auth Data` contains the redirect URL (string) and issuance timestamp (uint64).
+
+> [!WARNING]
+> The `Application Data` length is encoded using a `uint24`. Ensure that data lengths are within these limits.
+
+> [!NOTE]
+> The `Redirect URL` length is encoded using a `uint24`, and the `Issued At` field is a `uint64` timestamp representing when the attestation was issued. The encoding order is: `redirectUrlLength` (uint24), `redirectUrl` (string), `issuedAt` (uint64).
+
+### Attestation Validation
+
+- The attestation's **approved signer** must match the session signer.
+- A magic value is generated using a combination of a prefix, the wallet address, the attestation's audience hash, and issuer hash.
+- The attestation signature is validated against the identity signer from the configuration.
+- The target contract's `acceptImplicitRequest` function must return the expected magic value; otherwise, the call is rejected.
+
+> [!WARNING]
+> Implicit sessions require a properly encoded blacklist in the configuration. Calls to a blacklisted address will be rejected, and missing blacklist data will cause validation errors.
+
+---
+
+## Future Improvements
+
+Several improvements can be made
+
+> [!NOTE]
+> Configuration Flexibility: Introduce versioning or additional flags in the configuration encoding to support new features while preserving backward compatibility. Allow dynamic adjustments without breaking the merkle tree-based image hash structure.
+
+> [!NOTE]
+> Gas Optimization: Optimize the recursive encoding/decoding logic for configurations with a large number of permissions or deep branch nesting to reduce gas costs.
+
+> [!NOTE]
+> Call Signature Optimization: Optimize the call signature encoding to reduce the size of the calldata. A potential target for optimization is to remove repeated encodings of the same attestation data.
+
+> [!NOTE]
+> Advanced Permission Rules: Extend the permission system to support more complex conditional checks or dynamic rule adjustments. Provide improved error messages and diagnostic tools for failed validations.
+
+---
+
+## Conclusion
+
+The smart sessions system in Ecosystem wallets offers a flexible framework for authorizing batched operations via signed payloads. By leveraging detailed encoding schemes for configuration, permissions, and attestations - and by deriving an image hash that cryptographically fingerprints the configuration tree (even when sparse) - the system supports both explicit sessions and implicit sessions while ensuring robust validation. The detailed permission rules, including the use of **value**, **offset**, and **mask**, provide granular control over call data validation, and the cumulative flag facilitates persistent limits across calls. The outlined future improvements aim to enhance security, efficiency, and usability as the system evolves.
+
+This documentation serves as a technical guide for developers integrating and extending the smart sessions framework, providing both detailed encoding breakdowns and practical considerations for deployment and further development.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/docs/SIGNATURE.md b/lib/signals-implicit-mode/lib/sequence-v3/docs/SIGNATURE.md
new file mode 100644
index 000000000..38d1fb695
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/docs/SIGNATURE.md
@@ -0,0 +1,367 @@
+# **Technical Document: Sequence Signature Encoding**
+
+This document describes, in detail, how the Sequence signature encoding is structured, how each part is packed into bytes, and how chained signatures and top-level signatures work. It is purely technical, explaining the bit layouts, flags, and usage with examples.
+
+---
+
+## **1. Overview**
+
+Sequence uses a specialized signature format that:
+
+1. Has a **top-level signature** that includes:
+ - A single "signature flag" byte that encodes multiple fields (checkpointer usage, signature type, checkpoint size, threshold size, etc.).
+ - (Optionally) data related to an on-chain checkpointer contract.
+ - A notion of _chained signatures_ vs. _normal signatures_ vs. _“no chain id”_ signatures.
+ - A final threshold and checkpoint value that tie into the overall wallet or contract logic.
+
+2. Contains a **merkle-like structure** for the signers at the “branch” level, where each “leaf” or “node” is encoded using a separate mini-flag nibble. This is parsed with a loop in the `recoverBranch` function.
+
+3. Supports multiple sub-signature types, such as ECDSA (`FLAG_SIGNATURE_HASH` or `FLAG_SIGNATURE_ETH_SIGN`), ERC-1271 contract-based checks, nested “multi-sig inside multi-sig,” and special “sapient” signatures. Each sub-signature or branch piece is prefixed by one byte: the top nibble is the “flag type” and the bottom nibble contains per-flag configuration bits (like weight, sizes, or additional bits for `v`).
+
+---
+
+## **2. Top-level Signature Format**
+
+When `recover` is first invoked, it reads the **first byte** of the signature as `signatureFlag`. That byte is bit-packed as follows (with bit `0` as the least-significant bit):
+
+```
+ ┌─────────────── Bit 7 (0x80) : Static signature
+ │ ┌───────────── Bit 6 (0x40) : Checkpointer usage flag
+ │ │ ┌─────────── Bit 5 (0x20) : Threshold size indicator (0 => 1 byte, 1 => 2 bytes)
+ │ │ │ ┌──────── Bits 4..2 (0x1C) : Checkpoint size (encoded as an integer 0..7)
+ │ │ │ │ ┌───── Bit 1 (0x02) : "no chain id" signature type
+ │ │ │ │ │ ┌─── Bit 0 (0x01) : "chained" signature type
+[7 6 5 432 1 0]
+```
+
+We can break this down more concretely:
+
+1. **Bit 7** set (`0x80`) indicates a static signature:
+ - When set, the signature has been pre-stored in contract storage and bypasses normal validation
+ - Validation only checks:
+ - That the stored expiry timestamp has not passed
+ - That the stored signer matches the transaction sender (or is unset with `address(0)`)
+1. **Bit 6** set (`0x40`) means the signature includes an external **imageHash checkpointer**:
+ - If set, the signature will contain:
+ - The checkpointer contract `address`
+ - A 3-byte length for the “checkpointer data”
+ - That data, passed to `ICheckpointer(checkpointer).snapshotFor(...)`
+1. **Bits 4..2** (the field `((signatureFlag & 0x1c) >> 2)`) define the **checkpoint size** in bytes. Possible values are `0..7`. If this value is `N`, then the next `N` bytes of the signature after reading the flag (and optional checkpointer data) represent the **checkpoint**.
+1. **Bit 5** (`0x20`) sets how many bytes are used to read the threshold. If it is `0`, the threshold is read as 1 byte; if it is `1`, the threshold is read as 2 bytes. (Hence `( (signatureFlag & 0x20) >> 5 ) + 1`.)
+1. **Bit 1** (`0x02`) indicates the “no chain id” signature. If set, `_payload.noChainId` is true. This affects how `_payload.hash()` is computed.
+1. **Bit 0** (`0x01`) indicates the signature is **chained**. In that case, the code calls `recoverChained`, which processes multiple sub-signatures in sequence.
+
+Putting it together:
+
+- If bit `0` is set, we do a **chained** approach: The signature is composed of chunks, each chunk specifying a length and then a nested signature.
+- Otherwise, we do a “regular” top-level parse: we read the checkpoint size, threshold size, then parse the “branch” for signers.
+
+### **Example of a Top-level Signature Byte**
+
+Suppose the top-level `signatureFlag` is `0x74` in hex. Converting `0x74` to binary:
+
+```
+0x74 = 01110100 in binary
+ ^ ^ ^ ^
+bit 7: 0 (reserved)
+bit 6: 1 => checkpointer usage
+bit 5: 1 => threshold uses 2 bytes
+bits 4..2: 101 => checkpoint size = 5 bytes
+bit 1: 0 => normal (not "no chain id")
+bit 0: 0 => not chained
+```
+
+From this:
+
+- We first read an `address` for the checkpointer, then read 3 bytes for the checkpointer data length, etc.
+- We know we must parse **5 bytes** for the checkpoint value.
+- Then parse **2 bytes** for the threshold.
+- Then parse the remainder as the merkle-branch structure for signers.
+
+---
+
+## **3. Chained Signatures**
+
+When **bit 0** is set (the least-significant bit), the signature is **chained**. Instead of the usual approach (parsing threshold, checkpoint, etc. from that same byte), the code calls:
+
+```solidity
+recoverChained(_payload, snapshot, _signature);
+```
+
+A chained signature is a series of **signature chunks**, each chunk defined like this:
+
+```
+[3-byte length] [chunk of that length]
+[3-byte length] [chunk of that length]
+...
+```
+
+Each chunk can itself be a top-level signature in the sense that it calls `recover(...)` again—except it ignores checkpointer details after the first chunk. The code enforces:
+
+- Each chunk recovers `(threshold, weight, imageHash, checkpoint)`.
+- If `weight < threshold`, it reverts with `LowWeightChainedSignature`.
+- The `checkpoint` must be **strictly less** than the previous chunk’s `checkpoint`, ensuring correct ordering (`WrongChainedCheckpointOrder`).
+- All but the first chunk are interpreted as a “configuration update” with a special “linkedPayload.”
+
+This allows multiple signature instructions to be “chained” in a single byte array.
+
+```
+ 0 1 2 3
+ |----- byte indices: 0..2 => 3-byte length L1
+ |----- next L1 bytes => chunk #1
+ ...
+ |----- next 3 bytes => length L2
+ |----- next L2 bytes => chunk #2
+ ...
+ |----- next 3 bytes => length L3
+ |----- next L3 bytes => chunk #3
+ ...
+
+```
+
+Each chunk is itself a “top-level style signature” minus the repeated checkpointer usage. The final `(threshold, weight, imageHash, checkpoint)` from the last chunk can be used to validate the overall signature.
+
+---
+
+## **4. Branch-Level Parsing**
+
+Regardless of whether it is a chained signature or a direct one, eventually the code calls:
+
+```solidity
+recoverBranch(_payload, opHash, _signature)
+```
+
+This function loops over the remainder of the signature, reading one byte at a time as the “header” for a sub-signature or branch item. We’ll call that one byte `firstByte`. The code extracts:
+
+- `flag = (firstByte & 0xf0) >> 4;` (the top nibble)
+- The lower nibble is used as “free bits.”
+
+### **4.1 Flag Values**
+
+The contract defines constants:
+
+| Constant Name | Value (Decimal) | Purpose |
+| -------------------------------------- | --------------- | ----------------------------------------------------------------------------------------------------- |
+| `FLAG_SIGNATURE_HASH` | 0 | ECDSA signature with `r,yParityAndS` (ERC-2098 compact) directly against `_opHash`. |
+| `FLAG_ADDRESS` | 1 | Just an address “leaf” (with no actual ECDSA check) |
+| `FLAG_SIGNATURE_ERC1271` | 2 | A contract-based signature check using `isValidSignature(opHash, signature)` |
+| `FLAG_NODE` | 3 | Includes a raw 32-byte node hash in the merkle root. No weight added. |
+| `FLAG_BRANCH` | 4 | Nested branch. The next bytes specify length, then recursion into `recoverBranch`. |
+| `FLAG_SUBDIGEST` | 5 | Hard-coded “accepted subdigest.” If `_opHash` matches the stored 32 bytes, infinite weight. |
+| `FLAG_NESTED` | 6 | A nested multi-sig node with an internal threshold plus an external weight. |
+| `FLAG_SIGNATURE_ETH_SIGN` | 7 | ECDSA signature in “Eth_sign” format (`"\x19Ethereum Signed Message:\n32" + opHash`), using ERC-2098. |
+| `FLAG_SIGNATURE_ANY_ADDRESS_SUBDIGEST` | 8 | `FLAG_SUBDIGEST` but with counter factual support. |
+| `FLAG_SIGNATURE_SAPIENT` | 9 | A specialized “sapient” signature with an `ISapient` contract check. |
+| `FLAG_SIGNATURE_SAPIENT_COMPACT` | 10 | A specialized “sapient” signature with `ISapientCompact` and `_opHash` only. |
+
+When the parser sees `flag == someValue`, it dispatches to the corresponding block. Each block interprets the lower nibble differently.
+
+---
+
+## **5. Detailed Flag-by-Flag Format**
+
+Below are the internal mini-formats for each **flag**. Recall that in code, `firstByte` is the single byte at the start of each item, and we do:
+
+```
+flag = (firstByte & 0xf0) >> 4; // top nibble
+// "free nibble" = (firstByte & 0x0f)
+```
+
+Each bullet will show how the bits in the “free nibble” are used.
+
+---
+
+### 5.1 **Signature Hash** (`flag = 0`)
+
+- Uses **ERC-2098** to parse the signature in 64 bytes (`r` + `yParityAndS`).
+- The free nibble bits [3..0] define the signer's weight (0 => we read the weight from the next byte, else 1..15).
+- After reading `r` (32 bytes) and `yParityAndS` (32 bytes), the top bit of `yParityAndS` (bit 255) is `yParity` (0 or 1), which is added to 27 to form `v`. The remaining 255 bits are `s`.
+- We then perform `ecrecover(_opHash, v, r, s)`.
+
+**Example**
+If the sub-signature byte is `0x05` (`0000 0101` in binary), then top nibble=0 => `FLAG_SIGNATURE_HASH`, free nibble=5 => weight=5. We do **not** read an extra byte for the weight. Next, we read 64 bytes as the compact signature: 32 bytes for `r`, 32 bytes for `yParityAndS`. If the top bit of `yParityAndS` is 0 => `v=27`; if it is 1 => `v=28`. The rest is `s`. Then we do `ecrecover`.
+
+---
+
+### 5.2 **Address** (`flag = 1`)
+
+- Takes an address leaf (no ECDSA).
+- The free nibble bits 3..0 define the weight in the same scheme:
+ - If those bits are zero, read an extra byte for weight.
+ - Else use that 1..15 as the weight.
+- Then reads 20 bytes for the address.
+- Merges `_leafForAddressAndWeight(addr, weight)`.
+
+---
+
+### 5.3 **Signature ERC-1271** (`flag = 2`)
+
+- The free nibble bits are used as:
+ - The bottom two bits are the weight (with the same “0 => dynamic read, else 1..3” logic).
+ - The next two bits define the size of the “signature size” field: 0..3 means we read 0..3 bytes to get the dynamic length of the next part.
+- Then we read 20 bytes for the contract address, read that dynamic-size signature, and call `IERC1271(addr).isValidSignature(_opHash, data)`. If it returns the magic value `0x1626ba7e`, it is valid; otherwise revert.
+- Weight is added if valid.
+
+**Example**
+
+```
+firstByte = 0x2D -> 0010 1101 in binary
+ top nibble = 2 -> FLAG_SIGNATURE_ERC1271
+ free nibble = 0xD = 1101 in binary
+ bits 3..2 = 11 -> sizeSize=3 => read 3 bytes to get length
+ bits 1..0 = 01 -> weight=1
+```
+
+Then parse next 3 bytes to discover how big the signature is, read it, do the 1271 check.
+
+---
+
+### 5.4 **Node** (`flag = 3`)
+
+- No free bits used.
+- Simply reads a 32-byte “node hash” and merges it.
+- No weight is added.
+
+---
+
+### 5.5 **Branch** (`flag = 4`)
+
+- The free nibble bits 3..0 define how many bytes are used to read the upcoming “branch size.”
+- Once the branch size is read, we extract that many bytes as a sub-branch, and recursively call `recoverBranch` on that sub-slice.
+- We get `(nweight, nodeHash)` from that sub-branch, add `nweight` to the total, and merge the nodeHash into the root.
+
+---
+
+### 5.6 **Subdigest** (`flag = 5`)
+
+- The code reads a 32-byte “hardcoded subdigest.” If it matches the `_opHash`, sets `weight = type(uint256).max`.
+- Merges `_leafForHardcodedSubdigest(hardcoded)`.
+
+This effectively means “if the 32 bytes match the current operation hash, we grant infinite weight.”
+
+---
+
+### 5.7 **Nested** (`flag = 6`)
+
+- The free nibble is split:
+ - The bottom two bits define the “external weight.” Again, `0 => read from next byte, else 1..3`.
+ - The next two bits define the “internal threshold” size. If `0`, read 2 bytes from the next portion for that threshold, else 1..3 is just 1..3?
+ - Then read 3 bytes to get the length of the nested sub-branch, parse it. That yields `(internalWeight, internalRoot)`.
+ - If `internalWeight >= internalThreshold`, we add the external weight to the total. Finally, we merge `_leafForNested(internalRoot, internalThreshold, externalWeight)` into the root.
+
+**Example**
+
+```
+firstByte = 0x64 -> 0110 0100 in binary
+ top nibble = 6 -> FLAG_NESTED
+ free nibble = 0x4 = 0100 in binary
+ bits 3..2 = 01 -> internalThreshold=1
+ bits 1..0 = 00 -> externalWeight => read from next byte
+```
+
+Then read next byte for externalWeight, read next 2 bytes for threshold if needed, etc.
+
+---
+
+### 5.8 **Signature ETH Sign** (`flag = 7`)
+
+- Similar to `FLAG_SIGNATURE_HASH`, but recovers via:
+
+```
+ecrecover( keccak256("\x19Ethereum Signed Message:\n32" + _opHash), v, r, s )
+```
+
+- Uses **ERC-2098**: we read 64 bytes (32 for `r`, 32 for `yParityAndS`), retrieve `yParity` from the top bit, add 27 to form `v`, and use the remainder as `s`.
+- The free nibble bits [3..0] define the weight (0 => dynamic read, else 1..15).
+
+---
+
+### 5.9 **Signature Any Address Subgiest** (`flag = 8`)
+
+- The code reads a 32-byte "hardcoded subdigest." If it matches `_payload.hashFor(address(0))`, sets `weight = type(uint256).max`.
+- Merges `_leafForAnyAddressSubdigest(anyAddressOpHash)`.
+
+This effectively means "if the 32 bytes match the operation hash computed for address(0), we grant infinite weight." This allows for counter-factual payloads.
+
+---
+
+### 5.10 **Signature Sapient** (`flag = 9`)
+
+- The free nibble is structured like `ERC1271`: some bits define how many bytes to read for the signature, some bits define the weight.
+- Then it calls `ISapient(addr).recoverSapientSignature(_payload, data)`, which must return a “sapientImageHash” used in `_leafForSapient`.
+- Weight is added if valid.
+
+---
+
+### 5.11 **Signature Sapient Compact** (`flag = 10`)
+
+- Same approach as `FLAG_SIGNATURE_SAPIENT`, except the contract uses `ISapientCompact.recoverSapientSignatureCompact(_opHash, data)` instead, passing only `_opHash`.
+
+---
+
+## **6. Merkle Root Construction**
+
+The branch parser accumulates a “root” by repeatedly combining leaves with the function:
+
+```solidity
+root = LibOptim.fkeccak256(root, leaf)
+```
+
+In each sub-flag block, a leaf is computed, for example:
+
+- `_leafForAddressAndWeight(address, weight)`
+- `_leafForNested(internalRoot, threshold, externalWeight)`
+- `_leafForHardcodedSubdigest(someDigest)`
+- etc.
+
+The final `root` is combined with the threshold and checkpoint (and checkpointer address, if present) to yield the final “imageHash.” That is used to tie the signatures to a specific configuration or permission set.
+
+---
+
+## **7. Example Putting it All Together**
+
+Below is a hypothetical top-level signature that is **not** chained, uses a checkpointer, has a 2-byte threshold, a 1-byte checkpoint, and then includes a single ECDSA leaf:
+
+1. **signatureFlag** = `0x6C` => in binary `0110 1100`
+ - Bit 6 => `1`, so we have a checkpointer
+ - Bit 5 => `1`, threshold uses 2 bytes
+ - Bits 4..2 => `110` => checkpoint size = 6 bytes
+ - Bit 1 => `0`, normal chain id usage
+ - Bit 0 => `0`, not chained
+2. We read:
+ - `checkpointer` address (20 bytes)
+ - 3-byte checkpointer data size => parse that data
+ - 6 bytes => the “checkpoint” number
+ - 2 bytes => the threshold
+3. We jump into `recoverBranch`, and the next 1-byte might be `0x02` in hex => top nibble=0 => `FLAG_SIGNATURE_HASH` with free nibble=2 => weight=2. Then parse 64 bytes for ERC-2098. We derive `v` from the top bit of the second 32 bytes, do ecrecover, and merge the address in the merkle root.
+
+Finally, the code compares the final computed image hash, checks if we pass threshold vs. weight, checks snapshot logic, and returns `(threshold, weight, imageHash, checkpoint)`.
+
+---
+
+## **8. Snapshot and Checkpointer Logic**
+
+If the top-level byte indicates we have a checkpointer (`bit 6` set), we read:
+
+- The checkpointer’s address
+- The next 3 bytes => `checkpointerDataSize`
+- That many bytes => `checkpointerData`
+
+We call:
+
+```solidity
+snapshot = ICheckpointer(checkpointer).snapshotFor(address(this), checkpointerData);
+```
+
+This yields a `Snapshot { imageHash, checkpoint }`. If the final signature’s computed `imageHash` and `checkpoint` do not properly exceed or match the snapshot, the code can revert with `UnusedSnapshot`.
+
+---
+
+## **9. Summary**
+
+1. **Top-level “signatureFlag”** byte sets the “checkpointer usage,” “signature type,” “checkpoint size,” “threshold size,” etc.
+2. If the signature is **chained**, parse a series of sub-signatures, each of which in turn calls the normal `recover`.
+3. Eventually, a **branch** parse is done with `recoverBranch`, which looks at many items. Each item is marked by a single byte whose **top nibble** identifies the flag (ECDSA, ERC1271, sub-branch, nested multi-sig, etc.), and whose **bottom nibble** has special bits (like the signers’ weight, or signature-size format).
+4. The final output is `(threshold, weight, imageHash, checkpoint)` plus snapshot checks if any.
+
+This structure allows advanced multi-signature logic, nested multi-sigs, infinite weight if a known subdigest matches `_opHash`, and optional checkpointer extension.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/foundry.toml b/lib/signals-implicit-mode/lib/sequence-v3/foundry.toml
new file mode 100644
index 000000000..bd0622cc1
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/foundry.toml
@@ -0,0 +1,31 @@
+[profile.default]
+src = "src"
+out = "out"
+libs = ["lib"]
+via-ir = true
+optimizer = true
+optimizer_runs = 4294967295
+fs_permissions = [{ access = "read-write", path = "/tmp"}]
+solc = "0.8.28"
+evm_version = "paris"
+remappings = [
+ "account-abstraction/=lib/account-abstraction/contracts/"
+]
+
+[fuzz]
+max_test_rejects = 1000000
+
+[fmt]
+# Explicitly define all formatting rules
+multiline_func_header = "params_first"
+single_line_statement_blocks = "multi"
+sort_imports = true
+contract_new_lines = true
+override_spacing = false
+line_length = 120
+tab_width = 2
+bracket_spacing = true
+int_types = "long"
+quote_style = "double"
+hex_underscore = "remove"
+wrap_comments = false
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lefthook.yml b/lib/signals-implicit-mode/lib/sequence-v3/lefthook.yml
new file mode 100644
index 000000000..6adffd9a5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lefthook.yml
@@ -0,0 +1,8 @@
+pre-commit:
+ commands:
+ forge-fmt:
+ glob: '**/*.sol'
+ run: forge fmt {staged_files} && git add {staged_files}
+ prettier:
+ glob: '**/*.{js,jsx,ts,tsx,json,md,yml,yaml}'
+ run: pnpm prettier --write {staged_files} && git add {staged_files}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.eslintrc.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.eslintrc.js
new file mode 100644
index 000000000..fde1d6d69
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.eslintrc.js
@@ -0,0 +1,79 @@
+module.exports = {
+ env: {
+ browser: true,
+ es6: true,
+ jest: true,
+ mocha: true,
+ node: true
+ },
+ globals: {
+ artifacts: false,
+ assert: false,
+ contract: false,
+ web3: false
+ },
+ extends:
+ [
+ 'standard-with-typescript'
+ ],
+ // This is needed to add configuration to rules with type information
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ project: ['./tsconfig.json']
+ },
+ ignorePatterns: [
+ '.eslintrc.js',
+ '**/types/truffle-contracts',
+ 'coverage',
+ 'dist/'
+ ],
+ rules: {
+ 'no-console': 'off',
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/return-await': 'off',
+ '@typescript-eslint/no-unnecessary-type-assertion': 'off',
+ '@typescript-eslint/require-array-sort-compare': ['error',
+ {
+ ignoreStringArrays: true
+ }
+ ]
+ },
+ overrides: [
+ {
+ files: '*',
+ rules: {
+ '@typescript-eslint/naming-convention': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ '@typescript-eslint/restrict-template-expressions': 'off'
+ }
+ },
+ {
+ files: [
+ '**/test/**/*.ts'
+ ],
+ rules: {
+ 'no-unused-expressions': 'off',
+ // chai assertions trigger this rule
+ '@typescript-eslint/no-unused-expressions': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off'
+ }
+ },
+ {
+ // otherwise it will raise an error in every JavaScript file
+ files: ['*.ts'],
+ rules: {
+ '@typescript-eslint/prefer-ts-expect-error': 'off',
+ // allow using '${val}' with numbers, bool and null types
+ '@typescript-eslint/restrict-template-expressions': [
+ 'error',
+ {
+ allowNumber: true,
+ allowBoolean: true,
+ allowNullish: true,
+ allowNullable: true
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.github/workflows/build.yml b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.github/workflows/build.yml
new file mode 100644
index 000000000..c2ef0af86
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.github/workflows/build.yml
@@ -0,0 +1,89 @@
+name: Build
+on:
+ push:
+ branches:
+ - '*'
+ pull_request:
+ types: [opened, reopened, synchronize]
+
+env:
+ TS_NODE_TRANSPILE_ONLY: 1
+ FORCE_COLORS: 1
+
+# todo: extract shared seto/checkout/install/compile, instead of repeat in each job.
+jobs:
+
+ test:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/setup-node@v1
+ with:
+ node-version: '16'
+ - uses: actions/checkout@v1
+ - uses: actions/cache@v2
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ hashFiles('yarn.lock') }}
+ - run: yarn install
+ - run: yarn compile
+ - run: yarn tsc
+
+ - run: yarn run ci
+
+ gas-checks:
+ runs-on: ubuntu-latest
+ services:
+ localgeth:
+ image: dtr22/geth-dev
+
+ steps:
+ - uses: actions/setup-node@v1
+ with:
+ node-version: '16'
+ - uses: actions/checkout@v1
+ - uses: actions/cache@v2
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ hashFiles('yarn.lock') }}
+ - run: yarn install
+ - run: yarn compile
+ - run: yarn ci-gas-calc
+
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/setup-node@v1
+ with:
+ node-version: '16'
+ - uses: actions/checkout@v1
+ - uses: actions/cache@v2
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ hashFiles('yarn.lock') }}
+ - run: yarn install
+ - run: yarn lint
+
+ coverage:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/setup-node@v1
+ with:
+ node-version: '16'
+ - uses: actions/checkout@v1
+ - uses: actions/cache@v2
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ hashFiles('yarn.lock') }}
+ - run: yarn install
+
+ - run: yarn compile
+
+ - run: FORCE_COLOR=1 yarn coverage
+ - uses: actions/upload-artifact@v2
+ with:
+ name: solidity-coverage
+ path: |
+ coverage/
+ coverage.json
+
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solcover.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solcover.js
new file mode 100644
index 000000000..851e37d61
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solcover.js
@@ -0,0 +1,8 @@
+module.exports = {
+ skipFiles: [
+ "test",
+ "samples/bls/lib",
+ "utils/Exec.sol"
+ ],
+ configureYulOptimizer: true,
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solhint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solhint.json
new file mode 100644
index 000000000..2b5dda040
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solhint.json
@@ -0,0 +1,12 @@
+{
+ "extends": "solhint:recommended",
+ "rules": {
+ "compiler-version": ["error",">=0.7.5"],
+ "func-visibility": ["off",{"ignoreConstructors":true}],
+ "custom-errors": ["off"],
+ "explicit-types": ["warn", "explicit"],
+ "no-global-import": ["off"],
+ "immutable-vars-naming": ["off"],
+ "mark-callable-contracts": ["off"]
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solhintignore b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solhintignore
new file mode 100644
index 000000000..4972aa1be
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solhintignore
@@ -0,0 +1 @@
+contracts/samples/bls/lib/
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/LICENSE b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/LICENSE
new file mode 100644
index 000000000..f288702d2
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/README.md b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/README.md
new file mode 100644
index 000000000..57216f827
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/README.md
@@ -0,0 +1,11 @@
+Implementation of contracts for [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) account abstraction via alternative mempool.
+
+# Resources
+
+[Vitalik's post on account abstraction without Ethereum protocol changes](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a)
+
+[Discord server](http://discord.gg/fbDyENb6Y9)
+
+[Bundler reference implementation](https://github.com/eth-infinitism/bundler)
+
+[Bundler specification test suite](https://github.com/eth-infinitism/bundler-spec-tests)
diff --git "a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/audits/EIP_4337_\342\200\223_Ethereum_Account_Abstraction_Incremental_Audit_Feb_2023.pdf" "b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/audits/EIP_4337_\342\200\223_Ethereum_Account_Abstraction_Incremental_Audit_Feb_2023.pdf"
new file mode 100644
index 000000000..7050f47a6
Binary files /dev/null and "b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/audits/EIP_4337_\342\200\223_Ethereum_Account_Abstraction_Incremental_Audit_Feb_2023.pdf" differ
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/BaseAccount.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/BaseAccount.sol
new file mode 100644
index 000000000..459fc6ab3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/BaseAccount.sol
@@ -0,0 +1,113 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable avoid-low-level-calls */
+/* solhint-disable no-empty-blocks */
+
+import "../interfaces/IAccount.sol";
+import "../interfaces/IEntryPoint.sol";
+import "./UserOperationLib.sol";
+
+/**
+ * Basic account implementation.
+ * This contract provides the basic logic for implementing the IAccount interface - validateUserOp
+ * Specific account implementation should inherit it and provide the account-specific logic.
+ */
+abstract contract BaseAccount is IAccount {
+ using UserOperationLib for PackedUserOperation;
+
+ /**
+ * Return the account nonce.
+ * This method returns the next sequential nonce.
+ * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`
+ */
+ function getNonce() public view virtual returns (uint256) {
+ return entryPoint().getNonce(address(this), 0);
+ }
+
+ /**
+ * Return the entryPoint used by this account.
+ * Subclass should return the current entryPoint used by this account.
+ */
+ function entryPoint() public view virtual returns (IEntryPoint);
+
+ /// @inheritdoc IAccount
+ function validateUserOp(
+ PackedUserOperation calldata userOp,
+ bytes32 userOpHash,
+ uint256 missingAccountFunds
+ ) external virtual override returns (uint256 validationData) {
+ _requireFromEntryPoint();
+ validationData = _validateSignature(userOp, userOpHash);
+ _validateNonce(userOp.nonce);
+ _payPrefund(missingAccountFunds);
+ }
+
+ /**
+ * Ensure the request comes from the known entrypoint.
+ */
+ function _requireFromEntryPoint() internal view virtual {
+ require(
+ msg.sender == address(entryPoint()),
+ "account: not from EntryPoint"
+ );
+ }
+
+ /**
+ * Validate the signature is valid for this message.
+ * @param userOp - Validate the userOp.signature field.
+ * @param userOpHash - Convenient field: the hash of the request, to check the signature against.
+ * (also hashes the entrypoint and chain id)
+ * @return validationData - Signature and time-range of this operation.
+ * <20-byte> aggregatorOrSigFail - 0 for valid signature, 1 to mark signature failure,
+ * otherwise, an address of an aggregator contract.
+ * <6-byte> validUntil - last timestamp this operation is valid. 0 for "indefinite"
+ * <6-byte> validAfter - first timestamp this operation is valid
+ * If the account doesn't use time-range, it is enough to return
+ * SIG_VALIDATION_FAILED value (1) for signature failure.
+ * Note that the validation code cannot use block.timestamp (or block.number) directly.
+ */
+ function _validateSignature(
+ PackedUserOperation calldata userOp,
+ bytes32 userOpHash
+ ) internal virtual returns (uint256 validationData);
+
+ /**
+ * Validate the nonce of the UserOperation.
+ * This method may validate the nonce requirement of this account.
+ * e.g.
+ * To limit the nonce to use sequenced UserOps only (no "out of order" UserOps):
+ * `require(nonce < type(uint64).max)`
+ * For a hypothetical account that *requires* the nonce to be out-of-order:
+ * `require(nonce & type(uint64).max == 0)`
+ *
+ * The actual nonce uniqueness is managed by the EntryPoint, and thus no other
+ * action is needed by the account itself.
+ *
+ * @param nonce to validate
+ *
+ * solhint-disable-next-line no-empty-blocks
+ */
+ function _validateNonce(uint256 nonce) internal view virtual {
+ }
+
+ /**
+ * Sends to the entrypoint (msg.sender) the missing funds for this transaction.
+ * SubClass MAY override this method for better funds management
+ * (e.g. send to the entryPoint more than the minimum required, so that in future transactions
+ * it will not be required to send again).
+ * @param missingAccountFunds - The minimum value this method should send the entrypoint.
+ * This value MAY be zero, in case there is enough deposit,
+ * or the userOp has a paymaster.
+ */
+ function _payPrefund(uint256 missingAccountFunds) internal virtual {
+ if (missingAccountFunds != 0) {
+ (bool success, ) = payable(msg.sender).call{
+ value: missingAccountFunds,
+ gas: type(uint256).max
+ }("");
+ (success);
+ //ignore failure (its EntryPoint's job to verify, not account.)
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/BasePaymaster.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/BasePaymaster.sol
new file mode 100644
index 000000000..9bcb6fe63
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/BasePaymaster.sol
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable reason-string */
+
+import "@openzeppelin/contracts/access/Ownable.sol";
+import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import "../interfaces/IPaymaster.sol";
+import "../interfaces/IEntryPoint.sol";
+import "./UserOperationLib.sol";
+/**
+ * Helper class for creating a paymaster.
+ * provides helper methods for staking.
+ * Validates that the postOp is called only by the entryPoint.
+ */
+abstract contract BasePaymaster is IPaymaster, Ownable {
+ IEntryPoint public immutable entryPoint;
+
+ uint256 internal constant PAYMASTER_VALIDATION_GAS_OFFSET = UserOperationLib.PAYMASTER_VALIDATION_GAS_OFFSET;
+ uint256 internal constant PAYMASTER_POSTOP_GAS_OFFSET = UserOperationLib.PAYMASTER_POSTOP_GAS_OFFSET;
+ uint256 internal constant PAYMASTER_DATA_OFFSET = UserOperationLib.PAYMASTER_DATA_OFFSET;
+
+ constructor(IEntryPoint _entryPoint) Ownable(msg.sender) {
+ _validateEntryPointInterface(_entryPoint);
+ entryPoint = _entryPoint;
+ }
+
+ //sanity check: make sure this EntryPoint was compiled against the same
+ // IEntryPoint of this paymaster
+ function _validateEntryPointInterface(IEntryPoint _entryPoint) internal virtual {
+ require(IERC165(address(_entryPoint)).supportsInterface(type(IEntryPoint).interfaceId), "IEntryPoint interface mismatch");
+ }
+
+ /// @inheritdoc IPaymaster
+ function validatePaymasterUserOp(
+ PackedUserOperation calldata userOp,
+ bytes32 userOpHash,
+ uint256 maxCost
+ ) external override returns (bytes memory context, uint256 validationData) {
+ _requireFromEntryPoint();
+ return _validatePaymasterUserOp(userOp, userOpHash, maxCost);
+ }
+
+ /**
+ * Validate a user operation.
+ * @param userOp - The user operation.
+ * @param userOpHash - The hash of the user operation.
+ * @param maxCost - The maximum cost of the user operation.
+ */
+ function _validatePaymasterUserOp(
+ PackedUserOperation calldata userOp,
+ bytes32 userOpHash,
+ uint256 maxCost
+ ) internal virtual returns (bytes memory context, uint256 validationData);
+
+ /// @inheritdoc IPaymaster
+ function postOp(
+ PostOpMode mode,
+ bytes calldata context,
+ uint256 actualGasCost,
+ uint256 actualUserOpFeePerGas
+ ) external override {
+ _requireFromEntryPoint();
+ _postOp(mode, context, actualGasCost, actualUserOpFeePerGas);
+ }
+
+ /**
+ * Post-operation handler.
+ * (verified to be called only through the entryPoint)
+ * @dev If subclass returns a non-empty context from validatePaymasterUserOp,
+ * it must also implement this method.
+ * @param mode - Enum with the following options:
+ * opSucceeded - User operation succeeded.
+ * opReverted - User op reverted. The paymaster still has to pay for gas.
+ * postOpReverted - never passed in a call to postOp().
+ * @param context - The context value returned by validatePaymasterUserOp
+ * @param actualGasCost - Actual gas used so far (without this postOp call).
+ * @param actualUserOpFeePerGas - the gas price this UserOp pays. This value is based on the UserOp's maxFeePerGas
+ * and maxPriorityFee (and basefee)
+ * It is not the same as tx.gasprice, which is what the bundler pays.
+ */
+ function _postOp(
+ PostOpMode mode,
+ bytes calldata context,
+ uint256 actualGasCost,
+ uint256 actualUserOpFeePerGas
+ ) internal virtual {
+ (mode, context, actualGasCost, actualUserOpFeePerGas); // unused params
+ // subclass must override this method if validatePaymasterUserOp returns a context
+ revert("must override");
+ }
+
+ /**
+ * Add a deposit for this paymaster, used for paying for transaction fees.
+ */
+ function deposit() public payable {
+ entryPoint.depositTo{value: msg.value}(address(this));
+ }
+
+ /**
+ * Withdraw value from the deposit.
+ * @param withdrawAddress - Target to send to.
+ * @param amount - Amount to withdraw.
+ */
+ function withdrawTo(
+ address payable withdrawAddress,
+ uint256 amount
+ ) public onlyOwner {
+ entryPoint.withdrawTo(withdrawAddress, amount);
+ }
+
+ /**
+ * Add stake for this paymaster.
+ * This method can also carry eth value to add to the current stake.
+ * @param unstakeDelaySec - The unstake delay for this paymaster. Can only be increased.
+ */
+ function addStake(uint32 unstakeDelaySec) external payable onlyOwner {
+ entryPoint.addStake{value: msg.value}(unstakeDelaySec);
+ }
+
+ /**
+ * Return current paymaster's deposit on the entryPoint.
+ */
+ function getDeposit() public view returns (uint256) {
+ return entryPoint.balanceOf(address(this));
+ }
+
+ /**
+ * Unlock the stake, in order to withdraw it.
+ * The paymaster can't serve requests once unlocked, until it calls addStake again
+ */
+ function unlockStake() external onlyOwner {
+ entryPoint.unlockStake();
+ }
+
+ /**
+ * Withdraw the entire paymaster's stake.
+ * stake must be unlocked first (and then wait for the unstakeDelay to be over)
+ * @param withdrawAddress - The address to send withdrawn value.
+ */
+ function withdrawStake(address payable withdrawAddress) external onlyOwner {
+ entryPoint.withdrawStake(withdrawAddress);
+ }
+
+ /**
+ * Validate the call is made from a valid entrypoint
+ */
+ function _requireFromEntryPoint() internal virtual {
+ require(msg.sender == address(entryPoint), "Sender not EntryPoint");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/EntryPoint.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/EntryPoint.sol
new file mode 100644
index 000000000..44501524d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/EntryPoint.sol
@@ -0,0 +1,800 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+/* solhint-disable avoid-low-level-calls */
+/* solhint-disable no-inline-assembly */
+
+import "../interfaces/IAccount.sol";
+import "../interfaces/IAccountExecute.sol";
+import "../interfaces/IPaymaster.sol";
+import "../interfaces/IEntryPoint.sol";
+
+import "../utils/Exec.sol";
+import "./StakeManager.sol";
+import "./SenderCreator.sol";
+import "./Helpers.sol";
+import "./NonceManager.sol";
+import "./UserOperationLib.sol";
+
+import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
+import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
+
+/*
+ * Account-Abstraction (EIP-4337) singleton EntryPoint implementation.
+ * Only one instance required on each chain.
+ */
+
+/// @custom:security-contact https://bounty.ethereum.org
+contract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard, ERC165 {
+
+ using UserOperationLib for PackedUserOperation;
+
+ SenderCreator private immutable _senderCreator = new SenderCreator();
+
+ function senderCreator() internal view virtual returns (SenderCreator) {
+ return _senderCreator;
+ }
+
+ //compensate for innerHandleOps' emit message and deposit refund.
+ // allow some slack for future gas price changes.
+ uint256 private constant INNER_GAS_OVERHEAD = 10000;
+
+ // Marker for inner call revert on out of gas
+ bytes32 private constant INNER_OUT_OF_GAS = hex"deaddead";
+ bytes32 private constant INNER_REVERT_LOW_PREFUND = hex"deadaa51";
+
+ uint256 private constant REVERT_REASON_MAX_LEN = 2048;
+ uint256 private constant PENALTY_PERCENT = 10;
+
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
+ // note: solidity "type(IEntryPoint).interfaceId" is without inherited methods but we want to check everything
+ return interfaceId == (type(IEntryPoint).interfaceId ^ type(IStakeManager).interfaceId ^ type(INonceManager).interfaceId) ||
+ interfaceId == type(IEntryPoint).interfaceId ||
+ interfaceId == type(IStakeManager).interfaceId ||
+ interfaceId == type(INonceManager).interfaceId ||
+ super.supportsInterface(interfaceId);
+ }
+
+ /**
+ * Compensate the caller's beneficiary address with the collected fees of all UserOperations.
+ * @param beneficiary - The address to receive the fees.
+ * @param amount - Amount to transfer.
+ */
+ function _compensate(address payable beneficiary, uint256 amount) internal {
+ require(beneficiary != address(0), "AA90 invalid beneficiary");
+ (bool success, ) = beneficiary.call{value: amount}("");
+ require(success, "AA91 failed send to beneficiary");
+ }
+
+ /**
+ * Execute a user operation.
+ * @param opIndex - Index into the opInfo array.
+ * @param userOp - The userOp to execute.
+ * @param opInfo - The opInfo filled by validatePrepayment for this userOp.
+ * @return collected - The total amount this userOp paid.
+ */
+ function _executeUserOp(
+ uint256 opIndex,
+ PackedUserOperation calldata userOp,
+ UserOpInfo memory opInfo
+ )
+ internal
+ returns
+ (uint256 collected) {
+ uint256 preGas = gasleft();
+ bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);
+ bool success;
+ {
+ uint256 saveFreePtr;
+ assembly ("memory-safe") {
+ saveFreePtr := mload(0x40)
+ }
+ bytes calldata callData = userOp.callData;
+ bytes memory innerCall;
+ bytes4 methodSig;
+ assembly {
+ let len := callData.length
+ if gt(len, 3) {
+ methodSig := calldataload(callData.offset)
+ }
+ }
+ if (methodSig == IAccountExecute.executeUserOp.selector) {
+ bytes memory executeUserOp = abi.encodeCall(IAccountExecute.executeUserOp, (userOp, opInfo.userOpHash));
+ innerCall = abi.encodeCall(this.innerHandleOp, (executeUserOp, opInfo, context));
+ } else
+ {
+ innerCall = abi.encodeCall(this.innerHandleOp, (callData, opInfo, context));
+ }
+ assembly ("memory-safe") {
+ success := call(gas(), address(), 0, add(innerCall, 0x20), mload(innerCall), 0, 32)
+ collected := mload(0)
+ mstore(0x40, saveFreePtr)
+ }
+ }
+ if (!success) {
+ bytes32 innerRevertCode;
+ assembly ("memory-safe") {
+ let len := returndatasize()
+ if eq(32,len) {
+ returndatacopy(0, 0, 32)
+ innerRevertCode := mload(0)
+ }
+ }
+ if (innerRevertCode == INNER_OUT_OF_GAS) {
+ // handleOps was called with gas limit too low. abort entire bundle.
+ //can only be caused by bundler (leaving not enough gas for inner call)
+ revert FailedOp(opIndex, "AA95 out of gas");
+ } else if (innerRevertCode == INNER_REVERT_LOW_PREFUND) {
+ // innerCall reverted on prefund too low. treat entire prefund as "gas cost"
+ uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;
+ uint256 actualGasCost = opInfo.prefund;
+ emitPrefundTooLow(opInfo);
+ emitUserOperationEvent(opInfo, false, actualGasCost, actualGas);
+ collected = actualGasCost;
+ } else {
+ emit PostOpRevertReason(
+ opInfo.userOpHash,
+ opInfo.mUserOp.sender,
+ opInfo.mUserOp.nonce,
+ Exec.getReturnData(REVERT_REASON_MAX_LEN)
+ );
+
+ uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;
+ collected = _postExecution(
+ IPaymaster.PostOpMode.postOpReverted,
+ opInfo,
+ context,
+ actualGas
+ );
+ }
+ }
+ }
+
+ function emitUserOperationEvent(UserOpInfo memory opInfo, bool success, uint256 actualGasCost, uint256 actualGas) internal virtual {
+ emit UserOperationEvent(
+ opInfo.userOpHash,
+ opInfo.mUserOp.sender,
+ opInfo.mUserOp.paymaster,
+ opInfo.mUserOp.nonce,
+ success,
+ actualGasCost,
+ actualGas
+ );
+ }
+
+ function emitPrefundTooLow(UserOpInfo memory opInfo) internal virtual {
+ emit UserOperationPrefundTooLow(
+ opInfo.userOpHash,
+ opInfo.mUserOp.sender,
+ opInfo.mUserOp.nonce
+ );
+ }
+
+ /// @inheritdoc IEntryPoint
+ function handleOps(
+ PackedUserOperation[] calldata ops,
+ address payable beneficiary
+ ) public nonReentrant {
+ uint256 opslen = ops.length;
+ UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);
+
+ unchecked {
+ for (uint256 i = 0; i < opslen; i++) {
+ UserOpInfo memory opInfo = opInfos[i];
+ (
+ uint256 validationData,
+ uint256 pmValidationData
+ ) = _validatePrepayment(i, ops[i], opInfo);
+ _validateAccountAndPaymasterValidationData(
+ i,
+ validationData,
+ pmValidationData,
+ address(0)
+ );
+ }
+
+ uint256 collected = 0;
+ emit BeforeExecution();
+
+ for (uint256 i = 0; i < opslen; i++) {
+ collected += _executeUserOp(i, ops[i], opInfos[i]);
+ }
+
+ _compensate(beneficiary, collected);
+ }
+ }
+
+ /// @inheritdoc IEntryPoint
+ function handleAggregatedOps(
+ UserOpsPerAggregator[] calldata opsPerAggregator,
+ address payable beneficiary
+ ) public nonReentrant {
+
+ uint256 opasLen = opsPerAggregator.length;
+ uint256 totalOps = 0;
+ for (uint256 i = 0; i < opasLen; i++) {
+ UserOpsPerAggregator calldata opa = opsPerAggregator[i];
+ PackedUserOperation[] calldata ops = opa.userOps;
+ IAggregator aggregator = opa.aggregator;
+
+ //address(1) is special marker of "signature error"
+ require(
+ address(aggregator) != address(1),
+ "AA96 invalid aggregator"
+ );
+
+ if (address(aggregator) != address(0)) {
+ // solhint-disable-next-line no-empty-blocks
+ try aggregator.validateSignatures(ops, opa.signature) {} catch {
+ revert SignatureValidationFailed(address(aggregator));
+ }
+ }
+
+ totalOps += ops.length;
+ }
+
+ UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);
+
+ uint256 opIndex = 0;
+ for (uint256 a = 0; a < opasLen; a++) {
+ UserOpsPerAggregator calldata opa = opsPerAggregator[a];
+ PackedUserOperation[] calldata ops = opa.userOps;
+ IAggregator aggregator = opa.aggregator;
+
+ uint256 opslen = ops.length;
+ for (uint256 i = 0; i < opslen; i++) {
+ UserOpInfo memory opInfo = opInfos[opIndex];
+ (
+ uint256 validationData,
+ uint256 paymasterValidationData
+ ) = _validatePrepayment(opIndex, ops[i], opInfo);
+ _validateAccountAndPaymasterValidationData(
+ i,
+ validationData,
+ paymasterValidationData,
+ address(aggregator)
+ );
+ opIndex++;
+ }
+ }
+
+ emit BeforeExecution();
+
+ uint256 collected = 0;
+ opIndex = 0;
+ for (uint256 a = 0; a < opasLen; a++) {
+ UserOpsPerAggregator calldata opa = opsPerAggregator[a];
+ emit SignatureAggregatorChanged(address(opa.aggregator));
+ PackedUserOperation[] calldata ops = opa.userOps;
+ uint256 opslen = ops.length;
+
+ for (uint256 i = 0; i < opslen; i++) {
+ collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);
+ opIndex++;
+ }
+ }
+ emit SignatureAggregatorChanged(address(0));
+
+ _compensate(beneficiary, collected);
+ }
+
+ /**
+ * A memory copy of UserOp static fields only.
+ * Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.
+ */
+ struct MemoryUserOp {
+ address sender;
+ uint256 nonce;
+ uint256 verificationGasLimit;
+ uint256 callGasLimit;
+ uint256 paymasterVerificationGasLimit;
+ uint256 paymasterPostOpGasLimit;
+ uint256 preVerificationGas;
+ address paymaster;
+ uint256 maxFeePerGas;
+ uint256 maxPriorityFeePerGas;
+ }
+
+ struct UserOpInfo {
+ MemoryUserOp mUserOp;
+ bytes32 userOpHash;
+ uint256 prefund;
+ uint256 contextOffset;
+ uint256 preOpGas;
+ }
+
+ /**
+ * Inner function to handle a UserOperation.
+ * Must be declared "external" to open a call context, but it can only be called by handleOps.
+ * @param callData - The callData to execute.
+ * @param opInfo - The UserOpInfo struct.
+ * @param context - The context bytes.
+ * @return actualGasCost - the actual cost in eth this UserOperation paid for gas
+ */
+ function innerHandleOp(
+ bytes memory callData,
+ UserOpInfo memory opInfo,
+ bytes calldata context
+ ) external returns (uint256 actualGasCost) {
+ uint256 preGas = gasleft();
+ require(msg.sender == address(this), "AA92 internal call only");
+ MemoryUserOp memory mUserOp = opInfo.mUserOp;
+
+ uint256 callGasLimit = mUserOp.callGasLimit;
+ unchecked {
+ // handleOps was called with gas limit too low. abort entire bundle.
+ if (
+ gasleft() * 63 / 64 <
+ callGasLimit +
+ mUserOp.paymasterPostOpGasLimit +
+ INNER_GAS_OVERHEAD
+ ) {
+ assembly ("memory-safe") {
+ mstore(0, INNER_OUT_OF_GAS)
+ revert(0, 32)
+ }
+ }
+ }
+
+ IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;
+ if (callData.length > 0) {
+ bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);
+ if (!success) {
+ bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);
+ if (result.length > 0) {
+ emit UserOperationRevertReason(
+ opInfo.userOpHash,
+ mUserOp.sender,
+ mUserOp.nonce,
+ result
+ );
+ }
+ mode = IPaymaster.PostOpMode.opReverted;
+ }
+ }
+
+ unchecked {
+ uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;
+ return _postExecution(mode, opInfo, context, actualGas);
+ }
+ }
+
+ /// @inheritdoc IEntryPoint
+ function getUserOpHash(
+ PackedUserOperation calldata userOp
+ ) public view returns (bytes32) {
+ return
+ keccak256(abi.encode(userOp.hash(), address(this), block.chainid));
+ }
+
+ /**
+ * Copy general fields from userOp into the memory opInfo structure.
+ * @param userOp - The user operation.
+ * @param mUserOp - The memory user operation.
+ */
+ function _copyUserOpToMemory(
+ PackedUserOperation calldata userOp,
+ MemoryUserOp memory mUserOp
+ ) internal pure {
+ mUserOp.sender = userOp.sender;
+ mUserOp.nonce = userOp.nonce;
+ (mUserOp.verificationGasLimit, mUserOp.callGasLimit) = UserOperationLib.unpackUints(userOp.accountGasLimits);
+ mUserOp.preVerificationGas = userOp.preVerificationGas;
+ (mUserOp.maxPriorityFeePerGas, mUserOp.maxFeePerGas) = UserOperationLib.unpackUints(userOp.gasFees);
+ bytes calldata paymasterAndData = userOp.paymasterAndData;
+ if (paymasterAndData.length > 0) {
+ require(
+ paymasterAndData.length >= UserOperationLib.PAYMASTER_DATA_OFFSET,
+ "AA93 invalid paymasterAndData"
+ );
+ (mUserOp.paymaster, mUserOp.paymasterVerificationGasLimit, mUserOp.paymasterPostOpGasLimit) = UserOperationLib.unpackPaymasterStaticFields(paymasterAndData);
+ } else {
+ mUserOp.paymaster = address(0);
+ mUserOp.paymasterVerificationGasLimit = 0;
+ mUserOp.paymasterPostOpGasLimit = 0;
+ }
+ }
+
+ /**
+ * Get the required prefunded gas fee amount for an operation.
+ * @param mUserOp - The user operation in memory.
+ */
+ function _getRequiredPrefund(
+ MemoryUserOp memory mUserOp
+ ) internal pure returns (uint256 requiredPrefund) {
+ unchecked {
+ uint256 requiredGas = mUserOp.verificationGasLimit +
+ mUserOp.callGasLimit +
+ mUserOp.paymasterVerificationGasLimit +
+ mUserOp.paymasterPostOpGasLimit +
+ mUserOp.preVerificationGas;
+
+ requiredPrefund = requiredGas * mUserOp.maxFeePerGas;
+ }
+ }
+
+ /**
+ * Create sender smart contract account if init code is provided.
+ * @param opIndex - The operation index.
+ * @param opInfo - The operation info.
+ * @param initCode - The init code for the smart contract account.
+ */
+ function _createSenderIfNeeded(
+ uint256 opIndex,
+ UserOpInfo memory opInfo,
+ bytes calldata initCode
+ ) internal {
+ if (initCode.length != 0) {
+ address sender = opInfo.mUserOp.sender;
+ if (sender.code.length != 0)
+ revert FailedOp(opIndex, "AA10 sender already constructed");
+ address sender1 = senderCreator().createSender{
+ gas: opInfo.mUserOp.verificationGasLimit
+ }(initCode);
+ if (sender1 == address(0))
+ revert FailedOp(opIndex, "AA13 initCode failed or OOG");
+ if (sender1 != sender)
+ revert FailedOp(opIndex, "AA14 initCode must return sender");
+ if (sender1.code.length == 0)
+ revert FailedOp(opIndex, "AA15 initCode must create sender");
+ address factory = address(bytes20(initCode[0:20]));
+ emit AccountDeployed(
+ opInfo.userOpHash,
+ sender,
+ factory,
+ opInfo.mUserOp.paymaster
+ );
+ }
+ }
+
+ /// @inheritdoc IEntryPoint
+ function getSenderAddress(bytes calldata initCode) public {
+ address sender = senderCreator().createSender(initCode);
+ revert SenderAddressResult(sender);
+ }
+
+ /**
+ * Call account.validateUserOp.
+ * Revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.
+ * Decrement account's deposit if needed.
+ * @param opIndex - The operation index.
+ * @param op - The user operation.
+ * @param opInfo - The operation info.
+ * @param requiredPrefund - The required prefund amount.
+ */
+ function _validateAccountPrepayment(
+ uint256 opIndex,
+ PackedUserOperation calldata op,
+ UserOpInfo memory opInfo,
+ uint256 requiredPrefund,
+ uint256 verificationGasLimit
+ )
+ internal
+ returns (
+ uint256 validationData
+ )
+ {
+ unchecked {
+ MemoryUserOp memory mUserOp = opInfo.mUserOp;
+ address sender = mUserOp.sender;
+ _createSenderIfNeeded(opIndex, opInfo, op.initCode);
+ address paymaster = mUserOp.paymaster;
+ uint256 missingAccountFunds = 0;
+ if (paymaster == address(0)) {
+ uint256 bal = balanceOf(sender);
+ missingAccountFunds = bal > requiredPrefund
+ ? 0
+ : requiredPrefund - bal;
+ }
+ try
+ IAccount(sender).validateUserOp{
+ gas: verificationGasLimit
+ }(op, opInfo.userOpHash, missingAccountFunds)
+ returns (uint256 _validationData) {
+ validationData = _validationData;
+ } catch {
+ revert FailedOpWithRevert(opIndex, "AA23 reverted", Exec.getReturnData(REVERT_REASON_MAX_LEN));
+ }
+ if (paymaster == address(0)) {
+ DepositInfo storage senderInfo = deposits[sender];
+ uint256 deposit = senderInfo.deposit;
+ if (requiredPrefund > deposit) {
+ revert FailedOp(opIndex, "AA21 didn't pay prefund");
+ }
+ senderInfo.deposit = deposit - requiredPrefund;
+ }
+ }
+ }
+
+ /**
+ * In case the request has a paymaster:
+ * - Validate paymaster has enough deposit.
+ * - Call paymaster.validatePaymasterUserOp.
+ * - Revert with proper FailedOp in case paymaster reverts.
+ * - Decrement paymaster's deposit.
+ * @param opIndex - The operation index.
+ * @param op - The user operation.
+ * @param opInfo - The operation info.
+ * @param requiredPreFund - The required prefund amount.
+ */
+ function _validatePaymasterPrepayment(
+ uint256 opIndex,
+ PackedUserOperation calldata op,
+ UserOpInfo memory opInfo,
+ uint256 requiredPreFund
+ ) internal returns (bytes memory context, uint256 validationData) {
+ unchecked {
+ uint256 preGas = gasleft();
+ MemoryUserOp memory mUserOp = opInfo.mUserOp;
+ address paymaster = mUserOp.paymaster;
+ DepositInfo storage paymasterInfo = deposits[paymaster];
+ uint256 deposit = paymasterInfo.deposit;
+ if (deposit < requiredPreFund) {
+ revert FailedOp(opIndex, "AA31 paymaster deposit too low");
+ }
+ paymasterInfo.deposit = deposit - requiredPreFund;
+ uint256 pmVerificationGasLimit = mUserOp.paymasterVerificationGasLimit;
+ try
+ IPaymaster(paymaster).validatePaymasterUserOp{gas: pmVerificationGasLimit}(
+ op,
+ opInfo.userOpHash,
+ requiredPreFund
+ )
+ returns (bytes memory _context, uint256 _validationData) {
+ context = _context;
+ validationData = _validationData;
+ } catch {
+ revert FailedOpWithRevert(opIndex, "AA33 reverted", Exec.getReturnData(REVERT_REASON_MAX_LEN));
+ }
+ if (preGas - gasleft() > pmVerificationGasLimit) {
+ revert FailedOp(opIndex, "AA36 over paymasterVerificationGasLimit");
+ }
+ }
+ }
+
+ /**
+ * Revert if either account validationData or paymaster validationData is expired.
+ * @param opIndex - The operation index.
+ * @param validationData - The account validationData.
+ * @param paymasterValidationData - The paymaster validationData.
+ * @param expectedAggregator - The expected aggregator.
+ */
+ function _validateAccountAndPaymasterValidationData(
+ uint256 opIndex,
+ uint256 validationData,
+ uint256 paymasterValidationData,
+ address expectedAggregator
+ ) internal view {
+ (address aggregator, bool outOfTimeRange) = _getValidationData(
+ validationData
+ );
+ if (expectedAggregator != aggregator) {
+ revert FailedOp(opIndex, "AA24 signature error");
+ }
+ if (outOfTimeRange) {
+ revert FailedOp(opIndex, "AA22 expired or not due");
+ }
+ // pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.
+ // Non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation).
+ address pmAggregator;
+ (pmAggregator, outOfTimeRange) = _getValidationData(
+ paymasterValidationData
+ );
+ if (pmAggregator != address(0)) {
+ revert FailedOp(opIndex, "AA34 signature error");
+ }
+ if (outOfTimeRange) {
+ revert FailedOp(opIndex, "AA32 paymaster expired or not due");
+ }
+ }
+
+ /**
+ * Parse validationData into its components.
+ * @param validationData - The packed validation data (sigFailed, validAfter, validUntil).
+ * @return aggregator the aggregator of the validationData
+ * @return outOfTimeRange true if current time is outside the time range of this validationData.
+ */
+ function _getValidationData(
+ uint256 validationData
+ ) internal view returns (address aggregator, bool outOfTimeRange) {
+ if (validationData == 0) {
+ return (address(0), false);
+ }
+ ValidationData memory data = _parseValidationData(validationData);
+ // solhint-disable-next-line not-rely-on-time
+ outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;
+ aggregator = data.aggregator;
+ }
+
+ /**
+ * Validate account and paymaster (if defined) and
+ * also make sure total validation doesn't exceed verificationGasLimit.
+ * This method is called off-chain (simulateValidation()) and on-chain (from handleOps)
+ * @param opIndex - The index of this userOp into the "opInfos" array.
+ * @param userOp - The userOp to validate.
+ */
+ function _validatePrepayment(
+ uint256 opIndex,
+ PackedUserOperation calldata userOp,
+ UserOpInfo memory outOpInfo
+ )
+ internal
+ returns (uint256 validationData, uint256 paymasterValidationData)
+ {
+ uint256 preGas = gasleft();
+ MemoryUserOp memory mUserOp = outOpInfo.mUserOp;
+ _copyUserOpToMemory(userOp, mUserOp);
+ outOpInfo.userOpHash = getUserOpHash(userOp);
+
+ // Validate all numeric values in userOp are well below 128 bit, so they can safely be added
+ // and multiplied without causing overflow.
+ uint256 verificationGasLimit = mUserOp.verificationGasLimit;
+ uint256 maxGasValues = mUserOp.preVerificationGas |
+ verificationGasLimit |
+ mUserOp.callGasLimit |
+ mUserOp.paymasterVerificationGasLimit |
+ mUserOp.paymasterPostOpGasLimit |
+ mUserOp.maxFeePerGas |
+ mUserOp.maxPriorityFeePerGas;
+ require(maxGasValues <= type(uint120).max, "AA94 gas values overflow");
+
+ uint256 requiredPreFund = _getRequiredPrefund(mUserOp);
+ validationData = _validateAccountPrepayment(
+ opIndex,
+ userOp,
+ outOpInfo,
+ requiredPreFund,
+ verificationGasLimit
+ );
+
+ if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {
+ revert FailedOp(opIndex, "AA25 invalid account nonce");
+ }
+
+ unchecked {
+ if (preGas - gasleft() > verificationGasLimit) {
+ revert FailedOp(opIndex, "AA26 over verificationGasLimit");
+ }
+ }
+
+ bytes memory context;
+ if (mUserOp.paymaster != address(0)) {
+ (context, paymasterValidationData) = _validatePaymasterPrepayment(
+ opIndex,
+ userOp,
+ outOpInfo,
+ requiredPreFund
+ );
+ }
+ unchecked {
+ outOpInfo.prefund = requiredPreFund;
+ outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);
+ outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;
+ }
+ }
+
+ /**
+ * Process post-operation, called just after the callData is executed.
+ * If a paymaster is defined and its validation returned a non-empty context, its postOp is called.
+ * The excess amount is refunded to the account (or paymaster - if it was used in the request).
+ * @param mode - Whether is called from innerHandleOp, or outside (postOpReverted).
+ * @param opInfo - UserOp fields and info collected during validation.
+ * @param context - The context returned in validatePaymasterUserOp.
+ * @param actualGas - The gas used so far by this user operation.
+ */
+ function _postExecution(
+ IPaymaster.PostOpMode mode,
+ UserOpInfo memory opInfo,
+ bytes memory context,
+ uint256 actualGas
+ ) private returns (uint256 actualGasCost) {
+ uint256 preGas = gasleft();
+ unchecked {
+ address refundAddress;
+ MemoryUserOp memory mUserOp = opInfo.mUserOp;
+ uint256 gasPrice = getUserOpGasPrice(mUserOp);
+
+ address paymaster = mUserOp.paymaster;
+ if (paymaster == address(0)) {
+ refundAddress = mUserOp.sender;
+ } else {
+ refundAddress = paymaster;
+ if (context.length > 0) {
+ actualGasCost = actualGas * gasPrice;
+ if (mode != IPaymaster.PostOpMode.postOpReverted) {
+ try IPaymaster(paymaster).postOp{
+ gas: mUserOp.paymasterPostOpGasLimit
+ }(mode, context, actualGasCost, gasPrice)
+ // solhint-disable-next-line no-empty-blocks
+ {} catch {
+ bytes memory reason = Exec.getReturnData(REVERT_REASON_MAX_LEN);
+ revert PostOpReverted(reason);
+ }
+ }
+ }
+ }
+ actualGas += preGas - gasleft();
+
+ // Calculating a penalty for unused execution gas
+ {
+ uint256 executionGasLimit = mUserOp.callGasLimit + mUserOp.paymasterPostOpGasLimit;
+ uint256 executionGasUsed = actualGas - opInfo.preOpGas;
+ // this check is required for the gas used within EntryPoint and not covered by explicit gas limits
+ if (executionGasLimit > executionGasUsed) {
+ uint256 unusedGas = executionGasLimit - executionGasUsed;
+ uint256 unusedGasPenalty = (unusedGas * PENALTY_PERCENT) / 100;
+ actualGas += unusedGasPenalty;
+ }
+ }
+
+ actualGasCost = actualGas * gasPrice;
+ uint256 prefund = opInfo.prefund;
+ if (prefund < actualGasCost) {
+ if (mode == IPaymaster.PostOpMode.postOpReverted) {
+ actualGasCost = prefund;
+ emitPrefundTooLow(opInfo);
+ emitUserOperationEvent(opInfo, false, actualGasCost, actualGas);
+ } else {
+ assembly ("memory-safe") {
+ mstore(0, INNER_REVERT_LOW_PREFUND)
+ revert(0, 32)
+ }
+ }
+ } else {
+ uint256 refund = prefund - actualGasCost;
+ _incrementDeposit(refundAddress, refund);
+ bool success = mode == IPaymaster.PostOpMode.opSucceeded;
+ emitUserOperationEvent(opInfo, success, actualGasCost, actualGas);
+ }
+ } // unchecked
+ }
+
+ /**
+ * The gas price this UserOp agrees to pay.
+ * Relayer/block builder might submit the TX with higher priorityFee, but the user should not.
+ * @param mUserOp - The userOp to get the gas price from.
+ */
+ function getUserOpGasPrice(
+ MemoryUserOp memory mUserOp
+ ) internal view returns (uint256) {
+ unchecked {
+ uint256 maxFeePerGas = mUserOp.maxFeePerGas;
+ uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;
+ if (maxFeePerGas == maxPriorityFeePerGas) {
+ //legacy mode (for networks that don't support basefee opcode)
+ return maxFeePerGas;
+ }
+ return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);
+ }
+ }
+
+ /**
+ * The offset of the given bytes in memory.
+ * @param data - The bytes to get the offset of.
+ */
+ function getOffsetOfMemoryBytes(
+ bytes memory data
+ ) internal pure returns (uint256 offset) {
+ assembly {
+ offset := data
+ }
+ }
+
+ /**
+ * The bytes in memory at the given offset.
+ * @param offset - The offset to get the bytes from.
+ */
+ function getMemoryBytesFromOffset(
+ uint256 offset
+ ) internal pure returns (bytes memory data) {
+ assembly ("memory-safe") {
+ data := offset
+ }
+ }
+
+ /// @inheritdoc IEntryPoint
+ function delegateAndRevert(address target, bytes calldata data) external {
+ (bool success, bytes memory ret) = target.delegatecall(data);
+ revert DelegateAndRevert(success, ret);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/EntryPointSimulations.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/EntryPointSimulations.sol
new file mode 100644
index 000000000..b8c41ea12
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/EntryPointSimulations.sol
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable avoid-low-level-calls */
+/* solhint-disable no-inline-assembly */
+
+import "./EntryPoint.sol";
+import "../interfaces/IEntryPointSimulations.sol";
+
+/*
+ * This contract inherits the EntryPoint and extends it with the view-only methods that are executed by
+ * the bundler in order to check UserOperation validity and estimate its gas consumption.
+ * This contract should never be deployed on-chain and is only used as a parameter for the "eth_call" request.
+ */
+contract EntryPointSimulations is EntryPoint, IEntryPointSimulations {
+ // solhint-disable-next-line var-name-mixedcase
+ AggregatorStakeInfo private NOT_AGGREGATED = AggregatorStakeInfo(address(0), StakeInfo(0, 0));
+
+ SenderCreator private _senderCreator;
+
+ function initSenderCreator() internal virtual {
+ //this is the address of the first contract created with CREATE by this address.
+ address createdObj = address(uint160(uint256(keccak256(abi.encodePacked(hex"d694", address(this), hex"01")))));
+ _senderCreator = SenderCreator(createdObj);
+ }
+
+ function senderCreator() internal view virtual override returns (SenderCreator) {
+ // return the same senderCreator as real EntryPoint.
+ // this call is slightly (100) more expensive than EntryPoint's access to immutable member
+ return _senderCreator;
+ }
+
+ /**
+ * simulation contract should not be deployed, and specifically, accounts should not trust
+ * it as entrypoint, since the simulation functions don't check the signatures
+ */
+ constructor() {
+ require(block.number < 100, "should not be deployed");
+ }
+
+ /// @inheritdoc IEntryPointSimulations
+ function simulateValidation(
+ PackedUserOperation calldata userOp
+ )
+ external
+ returns (
+ ValidationResult memory
+ ){
+ UserOpInfo memory outOpInfo;
+
+ _simulationOnlyValidations(userOp);
+ (
+ uint256 validationData,
+ uint256 paymasterValidationData
+ ) = _validatePrepayment(0, userOp, outOpInfo);
+ StakeInfo memory paymasterInfo = _getStakeInfo(
+ outOpInfo.mUserOp.paymaster
+ );
+ StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);
+ StakeInfo memory factoryInfo;
+ {
+ bytes calldata initCode = userOp.initCode;
+ address factory = initCode.length >= 20
+ ? address(bytes20(initCode[0 : 20]))
+ : address(0);
+ factoryInfo = _getStakeInfo(factory);
+ }
+
+ address aggregator = address(uint160(validationData));
+ ReturnInfo memory returnInfo = ReturnInfo(
+ outOpInfo.preOpGas,
+ outOpInfo.prefund,
+ validationData,
+ paymasterValidationData,
+ getMemoryBytesFromOffset(outOpInfo.contextOffset)
+ );
+
+ AggregatorStakeInfo memory aggregatorInfo = NOT_AGGREGATED;
+ if (uint160(aggregator) != SIG_VALIDATION_SUCCESS && uint160(aggregator) != SIG_VALIDATION_FAILED) {
+ aggregatorInfo = AggregatorStakeInfo(
+ aggregator,
+ _getStakeInfo(aggregator)
+ );
+ }
+ return ValidationResult(
+ returnInfo,
+ senderInfo,
+ factoryInfo,
+ paymasterInfo,
+ aggregatorInfo
+ );
+ }
+
+ /// @inheritdoc IEntryPointSimulations
+ function simulateHandleOp(
+ PackedUserOperation calldata op,
+ address target,
+ bytes calldata targetCallData
+ )
+ external nonReentrant
+ returns (
+ ExecutionResult memory
+ ){
+ UserOpInfo memory opInfo;
+ _simulationOnlyValidations(op);
+ (
+ uint256 validationData,
+ uint256 paymasterValidationData
+ ) = _validatePrepayment(0, op, opInfo);
+
+ uint256 paid = _executeUserOp(0, op, opInfo);
+ bool targetSuccess;
+ bytes memory targetResult;
+ if (target != address(0)) {
+ (targetSuccess, targetResult) = target.call(targetCallData);
+ }
+ return ExecutionResult(
+ opInfo.preOpGas,
+ paid,
+ validationData,
+ paymasterValidationData,
+ targetSuccess,
+ targetResult
+ );
+ }
+
+ function _simulationOnlyValidations(
+ PackedUserOperation calldata userOp
+ )
+ internal
+ {
+ //initialize senderCreator(). we can't rely on constructor
+ initSenderCreator();
+
+ try
+ this._validateSenderAndPaymaster(
+ userOp.initCode,
+ userOp.sender,
+ userOp.paymasterAndData
+ )
+ // solhint-disable-next-line no-empty-blocks
+ {} catch Error(string memory revertReason) {
+ if (bytes(revertReason).length != 0) {
+ revert FailedOp(0, revertReason);
+ }
+ }
+ }
+
+ /**
+ * Called only during simulation.
+ * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.
+ * @param initCode - The smart account constructor code.
+ * @param sender - The sender address.
+ * @param paymasterAndData - The paymaster address (followed by other params, ignored by this method)
+ */
+ function _validateSenderAndPaymaster(
+ bytes calldata initCode,
+ address sender,
+ bytes calldata paymasterAndData
+ ) external view {
+ if (initCode.length == 0 && sender.code.length == 0) {
+ // it would revert anyway. but give a meaningful message
+ revert("AA20 account not deployed");
+ }
+ if (paymasterAndData.length >= 20) {
+ address paymaster = address(bytes20(paymasterAndData[0 : 20]));
+ if (paymaster.code.length == 0) {
+ // It would revert anyway. but give a meaningful message.
+ revert("AA30 paymaster not deployed");
+ }
+ }
+ // always revert
+ revert("");
+ }
+
+ //make sure depositTo cost is more than normal EntryPoint's cost,
+ // to mitigate DoS vector on the bundler
+ // empiric test showed that without this wrapper, simulation depositTo costs less..
+ function depositTo(address account) public override(IStakeManager, StakeManager) payable {
+ unchecked{
+ // silly code, to waste some gas to make sure depositTo is always little more
+ // expensive than on-chain call
+ uint256 x = 1;
+ while (x < 5) {
+ x++;
+ }
+ StakeManager.depositTo(account);
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/Helpers.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/Helpers.sol
new file mode 100644
index 000000000..857900861
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/Helpers.sol
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable no-inline-assembly */
+
+
+ /*
+ * For simulation purposes, validateUserOp (and validatePaymasterUserOp)
+ * must return this value in case of signature failure, instead of revert.
+ */
+uint256 constant SIG_VALIDATION_FAILED = 1;
+
+
+/*
+ * For simulation purposes, validateUserOp (and validatePaymasterUserOp)
+ * return this value on success.
+ */
+uint256 constant SIG_VALIDATION_SUCCESS = 0;
+
+
+/**
+ * Returned data from validateUserOp.
+ * validateUserOp returns a uint256, which is created by `_packedValidationData` and
+ * parsed by `_parseValidationData`.
+ * @param aggregator - address(0) - The account validated the signature by itself.
+ * address(1) - The account failed to validate the signature.
+ * otherwise - This is an address of a signature aggregator that must
+ * be used to validate the signature.
+ * @param validAfter - This UserOp is valid only after this timestamp.
+ * @param validaUntil - This UserOp is valid only up to this timestamp.
+ */
+struct ValidationData {
+ address aggregator;
+ uint48 validAfter;
+ uint48 validUntil;
+}
+
+/**
+ * Extract sigFailed, validAfter, validUntil.
+ * Also convert zero validUntil to type(uint48).max.
+ * @param validationData - The packed validation data.
+ */
+function _parseValidationData(
+ uint256 validationData
+) pure returns (ValidationData memory data) {
+ address aggregator = address(uint160(validationData));
+ uint48 validUntil = uint48(validationData >> 160);
+ if (validUntil == 0) {
+ validUntil = type(uint48).max;
+ }
+ uint48 validAfter = uint48(validationData >> (48 + 160));
+ return ValidationData(aggregator, validAfter, validUntil);
+}
+
+/**
+ * Helper to pack the return value for validateUserOp.
+ * @param data - The ValidationData to pack.
+ */
+function _packValidationData(
+ ValidationData memory data
+) pure returns (uint256) {
+ return
+ uint160(data.aggregator) |
+ (uint256(data.validUntil) << 160) |
+ (uint256(data.validAfter) << (160 + 48));
+}
+
+/**
+ * Helper to pack the return value for validateUserOp, when not using an aggregator.
+ * @param sigFailed - True for signature failure, false for success.
+ * @param validUntil - Last timestamp this UserOperation is valid (or zero for infinite).
+ * @param validAfter - First timestamp this UserOperation is valid.
+ */
+function _packValidationData(
+ bool sigFailed,
+ uint48 validUntil,
+ uint48 validAfter
+) pure returns (uint256) {
+ return
+ (sigFailed ? 1 : 0) |
+ (uint256(validUntil) << 160) |
+ (uint256(validAfter) << (160 + 48));
+}
+
+/**
+ * keccak function over calldata.
+ * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.
+ */
+ function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {
+ assembly ("memory-safe") {
+ let mem := mload(0x40)
+ let len := data.length
+ calldatacopy(mem, data.offset, len)
+ ret := keccak256(mem, len)
+ }
+ }
+
+
+/**
+ * The minimum of two numbers.
+ * @param a - First number.
+ * @param b - Second number.
+ */
+ function min(uint256 a, uint256 b) pure returns (uint256) {
+ return a < b ? a : b;
+ }
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/NonceManager.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/NonceManager.sol
new file mode 100644
index 000000000..7bef62e99
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/NonceManager.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+import "../interfaces/INonceManager.sol";
+
+/**
+ * nonce management functionality
+ */
+abstract contract NonceManager is INonceManager {
+
+ /**
+ * The next valid sequence number for a given nonce key.
+ */
+ mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;
+
+ /// @inheritdoc INonceManager
+ function getNonce(address sender, uint192 key)
+ public view override returns (uint256 nonce) {
+ return nonceSequenceNumber[sender][key] | (uint256(key) << 64);
+ }
+
+ // allow an account to manually increment its own nonce.
+ // (mainly so that during construction nonce can be made non-zero,
+ // to "absorb" the gas cost of first nonce increment to 1st transaction (construction),
+ // not to 2nd transaction)
+ function incrementNonce(uint192 key) public override {
+ nonceSequenceNumber[msg.sender][key]++;
+ }
+
+ /**
+ * validate nonce uniqueness for this account.
+ * called just after validateUserOp()
+ * @return true if the nonce was incremented successfully.
+ * false if the current nonce doesn't match the given one.
+ */
+ function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {
+
+ uint192 key = uint192(nonce >> 64);
+ uint64 seq = uint64(nonce);
+ return nonceSequenceNumber[sender][key]++ == seq;
+ }
+
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/SenderCreator.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/SenderCreator.sol
new file mode 100644
index 000000000..43ea80367
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/SenderCreator.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/**
+ * Helper contract for EntryPoint, to call userOp.initCode from a "neutral" address,
+ * which is explicitly not the entryPoint itself.
+ */
+contract SenderCreator {
+ /**
+ * Call the "initCode" factory to create and return the sender account address.
+ * @param initCode - The initCode value from a UserOp. contains 20 bytes of factory address,
+ * followed by calldata.
+ * @return sender - The returned address of the created account, or zero address on failure.
+ */
+ function createSender(
+ bytes calldata initCode
+ ) external returns (address sender) {
+ address factory = address(bytes20(initCode[0:20]));
+ bytes memory initCallData = initCode[20:];
+ bool success;
+ /* solhint-disable no-inline-assembly */
+ assembly ("memory-safe") {
+ success := call(
+ gas(),
+ factory,
+ 0,
+ add(initCallData, 0x20),
+ mload(initCallData),
+ 0,
+ 32
+ )
+ sender := mload(0)
+ }
+ if (!success) {
+ sender = address(0);
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/StakeManager.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/StakeManager.sol
new file mode 100644
index 000000000..f90210b7e
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/StakeManager.sol
@@ -0,0 +1,145 @@
+// SPDX-License-Identifier: GPL-3.0-only
+pragma solidity ^0.8.23;
+
+import "../interfaces/IStakeManager.sol";
+
+/* solhint-disable avoid-low-level-calls */
+/* solhint-disable not-rely-on-time */
+
+/**
+ * Manage deposits and stakes.
+ * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).
+ * Stake is value locked for at least "unstakeDelay" by a paymaster.
+ */
+abstract contract StakeManager is IStakeManager {
+ /// maps paymaster to their deposits and stakes
+ mapping(address => DepositInfo) public deposits;
+
+ /// @inheritdoc IStakeManager
+ function getDepositInfo(
+ address account
+ ) public view returns (DepositInfo memory info) {
+ return deposits[account];
+ }
+
+ /**
+ * Internal method to return just the stake info.
+ * @param addr - The account to query.
+ */
+ function _getStakeInfo(
+ address addr
+ ) internal view returns (StakeInfo memory info) {
+ DepositInfo storage depositInfo = deposits[addr];
+ info.stake = depositInfo.stake;
+ info.unstakeDelaySec = depositInfo.unstakeDelaySec;
+ }
+
+ /// @inheritdoc IStakeManager
+ function balanceOf(address account) public view returns (uint256) {
+ return deposits[account].deposit;
+ }
+
+ receive() external payable {
+ depositTo(msg.sender);
+ }
+
+ /**
+ * Increments an account's deposit.
+ * @param account - The account to increment.
+ * @param amount - The amount to increment by.
+ * @return the updated deposit of this account
+ */
+ function _incrementDeposit(address account, uint256 amount) internal returns (uint256) {
+ DepositInfo storage info = deposits[account];
+ uint256 newAmount = info.deposit + amount;
+ info.deposit = newAmount;
+ return newAmount;
+ }
+
+ /**
+ * Add to the deposit of the given account.
+ * @param account - The account to add to.
+ */
+ function depositTo(address account) public virtual payable {
+ uint256 newDeposit = _incrementDeposit(account, msg.value);
+ emit Deposited(account, newDeposit);
+ }
+
+ /**
+ * Add to the account's stake - amount and delay
+ * any pending unstake is first cancelled.
+ * @param unstakeDelaySec The new lock duration before the deposit can be withdrawn.
+ */
+ function addStake(uint32 unstakeDelaySec) public payable {
+ DepositInfo storage info = deposits[msg.sender];
+ require(unstakeDelaySec > 0, "must specify unstake delay");
+ require(
+ unstakeDelaySec >= info.unstakeDelaySec,
+ "cannot decrease unstake time"
+ );
+ uint256 stake = info.stake + msg.value;
+ require(stake > 0, "no stake specified");
+ require(stake <= type(uint112).max, "stake overflow");
+ deposits[msg.sender] = DepositInfo(
+ info.deposit,
+ true,
+ uint112(stake),
+ unstakeDelaySec,
+ 0
+ );
+ emit StakeLocked(msg.sender, stake, unstakeDelaySec);
+ }
+
+ /**
+ * Attempt to unlock the stake.
+ * The value can be withdrawn (using withdrawStake) after the unstake delay.
+ */
+ function unlockStake() external {
+ DepositInfo storage info = deposits[msg.sender];
+ require(info.unstakeDelaySec != 0, "not staked");
+ require(info.staked, "already unstaking");
+ uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;
+ info.withdrawTime = withdrawTime;
+ info.staked = false;
+ emit StakeUnlocked(msg.sender, withdrawTime);
+ }
+
+ /**
+ * Withdraw from the (unlocked) stake.
+ * Must first call unlockStake and wait for the unstakeDelay to pass.
+ * @param withdrawAddress - The address to send withdrawn value.
+ */
+ function withdrawStake(address payable withdrawAddress) external {
+ DepositInfo storage info = deposits[msg.sender];
+ uint256 stake = info.stake;
+ require(stake > 0, "No stake to withdraw");
+ require(info.withdrawTime > 0, "must call unlockStake() first");
+ require(
+ info.withdrawTime <= block.timestamp,
+ "Stake withdrawal is not due"
+ );
+ info.unstakeDelaySec = 0;
+ info.withdrawTime = 0;
+ info.stake = 0;
+ emit StakeWithdrawn(msg.sender, withdrawAddress, stake);
+ (bool success,) = withdrawAddress.call{value: stake}("");
+ require(success, "failed to withdraw stake");
+ }
+
+ /**
+ * Withdraw from the deposit.
+ * @param withdrawAddress - The address to send withdrawn value.
+ * @param withdrawAmount - The amount to withdraw.
+ */
+ function withdrawTo(
+ address payable withdrawAddress,
+ uint256 withdrawAmount
+ ) external {
+ DepositInfo storage info = deposits[msg.sender];
+ require(withdrawAmount <= info.deposit, "Withdraw amount too large");
+ info.deposit = info.deposit - withdrawAmount;
+ emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);
+ (bool success,) = withdrawAddress.call{value: withdrawAmount}("");
+ require(success, "failed to withdraw");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/UserOperationLib.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/UserOperationLib.sol
new file mode 100644
index 000000000..dcf5740cc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/UserOperationLib.sol
@@ -0,0 +1,139 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable no-inline-assembly */
+
+import "../interfaces/PackedUserOperation.sol";
+import {calldataKeccak, min} from "./Helpers.sol";
+
+/**
+ * Utility functions helpful when working with UserOperation structs.
+ */
+library UserOperationLib {
+
+ uint256 public constant PAYMASTER_VALIDATION_GAS_OFFSET = 20;
+ uint256 public constant PAYMASTER_POSTOP_GAS_OFFSET = 36;
+ uint256 public constant PAYMASTER_DATA_OFFSET = 52;
+ /**
+ * Get sender from user operation data.
+ * @param userOp - The user operation data.
+ */
+ function getSender(
+ PackedUserOperation calldata userOp
+ ) internal pure returns (address) {
+ address data;
+ //read sender from userOp, which is first userOp member (saves 800 gas...)
+ assembly {
+ data := calldataload(userOp)
+ }
+ return address(uint160(data));
+ }
+
+ /**
+ * Relayer/block builder might submit the TX with higher priorityFee,
+ * but the user should not pay above what he signed for.
+ * @param userOp - The user operation data.
+ */
+ function gasPrice(
+ PackedUserOperation calldata userOp
+ ) internal view returns (uint256) {
+ unchecked {
+ (uint256 maxPriorityFeePerGas, uint256 maxFeePerGas) = unpackUints(userOp.gasFees);
+ if (maxFeePerGas == maxPriorityFeePerGas) {
+ //legacy mode (for networks that don't support basefee opcode)
+ return maxFeePerGas;
+ }
+ return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);
+ }
+ }
+
+ /**
+ * Pack the user operation data into bytes for hashing.
+ * @param userOp - The user operation data.
+ */
+ function encode(
+ PackedUserOperation calldata userOp
+ ) internal pure returns (bytes memory ret) {
+ address sender = getSender(userOp);
+ uint256 nonce = userOp.nonce;
+ bytes32 hashInitCode = calldataKeccak(userOp.initCode);
+ bytes32 hashCallData = calldataKeccak(userOp.callData);
+ bytes32 accountGasLimits = userOp.accountGasLimits;
+ uint256 preVerificationGas = userOp.preVerificationGas;
+ bytes32 gasFees = userOp.gasFees;
+ bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);
+
+ return abi.encode(
+ sender, nonce,
+ hashInitCode, hashCallData,
+ accountGasLimits, preVerificationGas, gasFees,
+ hashPaymasterAndData
+ );
+ }
+
+ function unpackUints(
+ bytes32 packed
+ ) internal pure returns (uint256 high128, uint256 low128) {
+ return (uint128(bytes16(packed)), uint128(uint256(packed)));
+ }
+
+ //unpack just the high 128-bits from a packed value
+ function unpackHigh128(bytes32 packed) internal pure returns (uint256) {
+ return uint256(packed) >> 128;
+ }
+
+ // unpack just the low 128-bits from a packed value
+ function unpackLow128(bytes32 packed) internal pure returns (uint256) {
+ return uint128(uint256(packed));
+ }
+
+ function unpackMaxPriorityFeePerGas(PackedUserOperation calldata userOp)
+ internal pure returns (uint256) {
+ return unpackHigh128(userOp.gasFees);
+ }
+
+ function unpackMaxFeePerGas(PackedUserOperation calldata userOp)
+ internal pure returns (uint256) {
+ return unpackLow128(userOp.gasFees);
+ }
+
+ function unpackVerificationGasLimit(PackedUserOperation calldata userOp)
+ internal pure returns (uint256) {
+ return unpackHigh128(userOp.accountGasLimits);
+ }
+
+ function unpackCallGasLimit(PackedUserOperation calldata userOp)
+ internal pure returns (uint256) {
+ return unpackLow128(userOp.accountGasLimits);
+ }
+
+ function unpackPaymasterVerificationGasLimit(PackedUserOperation calldata userOp)
+ internal pure returns (uint256) {
+ return uint128(bytes16(userOp.paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_POSTOP_GAS_OFFSET]));
+ }
+
+ function unpackPostOpGasLimit(PackedUserOperation calldata userOp)
+ internal pure returns (uint256) {
+ return uint128(bytes16(userOp.paymasterAndData[PAYMASTER_POSTOP_GAS_OFFSET : PAYMASTER_DATA_OFFSET]));
+ }
+
+ function unpackPaymasterStaticFields(
+ bytes calldata paymasterAndData
+ ) internal pure returns (address paymaster, uint256 validationGasLimit, uint256 postOpGasLimit) {
+ return (
+ address(bytes20(paymasterAndData[: PAYMASTER_VALIDATION_GAS_OFFSET])),
+ uint128(bytes16(paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_POSTOP_GAS_OFFSET])),
+ uint128(bytes16(paymasterAndData[PAYMASTER_POSTOP_GAS_OFFSET : PAYMASTER_DATA_OFFSET]))
+ );
+ }
+
+ /**
+ * Hash the user operation data.
+ * @param userOp - The user operation data.
+ */
+ function hash(
+ PackedUserOperation calldata userOp
+ ) internal pure returns (bytes32) {
+ return keccak256(encode(userOp));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAccount.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAccount.sol
new file mode 100644
index 000000000..e3b355fbc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAccount.sol
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >=0.7.5;
+
+import "./PackedUserOperation.sol";
+
+interface IAccount {
+ /**
+ * Validate user's signature and nonce
+ * the entryPoint will make the call to the recipient only if this validation call returns successfully.
+ * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).
+ * This allows making a "simulation call" without a valid signature
+ * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.
+ *
+ * @dev Must validate caller is the entryPoint.
+ * Must validate the signature and nonce
+ * @param userOp - The operation that is about to be executed.
+ * @param userOpHash - Hash of the user's request data. can be used as the basis for signature.
+ * @param missingAccountFunds - Missing funds on the account's deposit in the entrypoint.
+ * This is the minimum amount to transfer to the sender(entryPoint) to be
+ * able to make the call. The excess is left as a deposit in the entrypoint
+ * for future calls. Can be withdrawn anytime using "entryPoint.withdrawTo()".
+ * In case there is a paymaster in the request (or the current deposit is high
+ * enough), this value will be zero.
+ * @return validationData - Packaged ValidationData structure. use `_packValidationData` and
+ * `_unpackValidationData` to encode and decode.
+ * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,
+ * otherwise, an address of an "authorizer" contract.
+ * <6-byte> validUntil - Last timestamp this operation is valid. 0 for "indefinite"
+ * <6-byte> validAfter - First timestamp this operation is valid
+ * If an account doesn't use time-range, it is enough to
+ * return SIG_VALIDATION_FAILED value (1) for signature failure.
+ * Note that the validation code cannot use block.timestamp (or block.number) directly.
+ */
+ function validateUserOp(
+ PackedUserOperation calldata userOp,
+ bytes32 userOpHash,
+ uint256 missingAccountFunds
+ ) external returns (uint256 validationData);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAccountExecute.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAccountExecute.sol
new file mode 100644
index 000000000..4433c80ce
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAccountExecute.sol
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >=0.7.5;
+
+import "./PackedUserOperation.sol";
+
+interface IAccountExecute {
+ /**
+ * Account may implement this execute method.
+ * passing this methodSig at the beginning of callData will cause the entryPoint to pass the full UserOp (and hash)
+ * to the account.
+ * The account should skip the methodSig, and use the callData (and optionally, other UserOp fields)
+ *
+ * @param userOp - The operation that was just validated.
+ * @param userOpHash - Hash of the user's request data.
+ */
+ function executeUserOp(
+ PackedUserOperation calldata userOp,
+ bytes32 userOpHash
+ ) external;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAggregator.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAggregator.sol
new file mode 100644
index 000000000..070d8f27a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAggregator.sol
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >=0.7.5;
+
+import "./PackedUserOperation.sol";
+
+/**
+ * Aggregated Signatures validator.
+ */
+interface IAggregator {
+ /**
+ * Validate aggregated signature.
+ * Revert if the aggregated signature does not match the given list of operations.
+ * @param userOps - Array of UserOperations to validate the signature for.
+ * @param signature - The aggregated signature.
+ */
+ function validateSignatures(
+ PackedUserOperation[] calldata userOps,
+ bytes calldata signature
+ ) external view;
+
+ /**
+ * Validate signature of a single userOp.
+ * This method should be called by bundler after EntryPointSimulation.simulateValidation() returns
+ * the aggregator this account uses.
+ * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.
+ * @param userOp - The userOperation received from the user.
+ * @return sigForUserOp - The value to put into the signature field of the userOp when calling handleOps.
+ * (usually empty, unless account and aggregator support some kind of "multisig".
+ */
+ function validateUserOpSignature(
+ PackedUserOperation calldata userOp
+ ) external view returns (bytes memory sigForUserOp);
+
+ /**
+ * Aggregate multiple signatures into a single value.
+ * This method is called off-chain to calculate the signature to pass with handleOps()
+ * bundler MAY use optimized custom code perform this aggregation.
+ * @param userOps - Array of UserOperations to collect the signatures from.
+ * @return aggregatedSignature - The aggregated signature.
+ */
+ function aggregateSignatures(
+ PackedUserOperation[] calldata userOps
+ ) external view returns (bytes memory aggregatedSignature);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IEntryPoint.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IEntryPoint.sol
new file mode 100644
index 000000000..28c26f98e
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IEntryPoint.sol
@@ -0,0 +1,223 @@
+/**
+ ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.
+ ** Only one instance required on each chain.
+ **/
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >=0.7.5;
+
+/* solhint-disable avoid-low-level-calls */
+/* solhint-disable no-inline-assembly */
+/* solhint-disable reason-string */
+
+import "./PackedUserOperation.sol";
+import "./IStakeManager.sol";
+import "./IAggregator.sol";
+import "./INonceManager.sol";
+
+interface IEntryPoint is IStakeManager, INonceManager {
+ /***
+ * An event emitted after each successful request.
+ * @param userOpHash - Unique identifier for the request (hash its entire content, except signature).
+ * @param sender - The account that generates this request.
+ * @param paymaster - If non-null, the paymaster that pays for this request.
+ * @param nonce - The nonce value from the request.
+ * @param success - True if the sender transaction succeeded, false if reverted.
+ * @param actualGasCost - Actual amount paid (by account or paymaster) for this UserOperation.
+ * @param actualGasUsed - Total gas used by this UserOperation (including preVerification, creation,
+ * validation and execution).
+ */
+ event UserOperationEvent(
+ bytes32 indexed userOpHash,
+ address indexed sender,
+ address indexed paymaster,
+ uint256 nonce,
+ bool success,
+ uint256 actualGasCost,
+ uint256 actualGasUsed
+ );
+
+ /**
+ * Account "sender" was deployed.
+ * @param userOpHash - The userOp that deployed this account. UserOperationEvent will follow.
+ * @param sender - The account that is deployed
+ * @param factory - The factory used to deploy this account (in the initCode)
+ * @param paymaster - The paymaster used by this UserOp
+ */
+ event AccountDeployed(
+ bytes32 indexed userOpHash,
+ address indexed sender,
+ address factory,
+ address paymaster
+ );
+
+ /**
+ * An event emitted if the UserOperation "callData" reverted with non-zero length.
+ * @param userOpHash - The request unique identifier.
+ * @param sender - The sender of this request.
+ * @param nonce - The nonce used in the request.
+ * @param revertReason - The return bytes from the (reverted) call to "callData".
+ */
+ event UserOperationRevertReason(
+ bytes32 indexed userOpHash,
+ address indexed sender,
+ uint256 nonce,
+ bytes revertReason
+ );
+
+ /**
+ * An event emitted if the UserOperation Paymaster's "postOp" call reverted with non-zero length.
+ * @param userOpHash - The request unique identifier.
+ * @param sender - The sender of this request.
+ * @param nonce - The nonce used in the request.
+ * @param revertReason - The return bytes from the (reverted) call to "callData".
+ */
+ event PostOpRevertReason(
+ bytes32 indexed userOpHash,
+ address indexed sender,
+ uint256 nonce,
+ bytes revertReason
+ );
+
+ /**
+ * UserOp consumed more than prefund. The UserOperation is reverted, and no refund is made.
+ * @param userOpHash - The request unique identifier.
+ * @param sender - The sender of this request.
+ * @param nonce - The nonce used in the request.
+ */
+ event UserOperationPrefundTooLow(
+ bytes32 indexed userOpHash,
+ address indexed sender,
+ uint256 nonce
+ );
+
+ /**
+ * An event emitted by handleOps(), before starting the execution loop.
+ * Any event emitted before this event, is part of the validation.
+ */
+ event BeforeExecution();
+
+ /**
+ * Signature aggregator used by the following UserOperationEvents within this bundle.
+ * @param aggregator - The aggregator used for the following UserOperationEvents.
+ */
+ event SignatureAggregatorChanged(address indexed aggregator);
+
+ /**
+ * A custom revert error of handleOps, to identify the offending op.
+ * Should be caught in off-chain handleOps simulation and not happen on-chain.
+ * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.
+ * NOTE: If simulateValidation passes successfully, there should be no reason for handleOps to fail on it.
+ * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).
+ * @param reason - Revert reason. The string starts with a unique code "AAmn",
+ * where "m" is "1" for factory, "2" for account and "3" for paymaster issues,
+ * so a failure can be attributed to the correct entity.
+ */
+ error FailedOp(uint256 opIndex, string reason);
+
+ /**
+ * A custom revert error of handleOps, to report a revert by account or paymaster.
+ * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).
+ * @param reason - Revert reason. see FailedOp(uint256,string), above
+ * @param inner - data from inner cought revert reason
+ * @dev note that inner is truncated to 2048 bytes
+ */
+ error FailedOpWithRevert(uint256 opIndex, string reason, bytes inner);
+
+ error PostOpReverted(bytes returnData);
+
+ /**
+ * Error case when a signature aggregator fails to verify the aggregated signature it had created.
+ * @param aggregator The aggregator that failed to verify the signature
+ */
+ error SignatureValidationFailed(address aggregator);
+
+ // Return value of getSenderAddress.
+ error SenderAddressResult(address sender);
+
+ // UserOps handled, per aggregator.
+ struct UserOpsPerAggregator {
+ PackedUserOperation[] userOps;
+ // Aggregator address
+ IAggregator aggregator;
+ // Aggregated signature
+ bytes signature;
+ }
+
+ /**
+ * Execute a batch of UserOperations.
+ * No signature aggregator is used.
+ * If any account requires an aggregator (that is, it returned an aggregator when
+ * performing simulateValidation), then handleAggregatedOps() must be used instead.
+ * @param ops - The operations to execute.
+ * @param beneficiary - The address to receive the fees.
+ */
+ function handleOps(
+ PackedUserOperation[] calldata ops,
+ address payable beneficiary
+ ) external;
+
+ /**
+ * Execute a batch of UserOperation with Aggregators
+ * @param opsPerAggregator - The operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts).
+ * @param beneficiary - The address to receive the fees.
+ */
+ function handleAggregatedOps(
+ UserOpsPerAggregator[] calldata opsPerAggregator,
+ address payable beneficiary
+ ) external;
+
+ /**
+ * Generate a request Id - unique identifier for this request.
+ * The request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.
+ * @param userOp - The user operation to generate the request ID for.
+ * @return hash the hash of this UserOperation
+ */
+ function getUserOpHash(
+ PackedUserOperation calldata userOp
+ ) external view returns (bytes32);
+
+ /**
+ * Gas and return values during simulation.
+ * @param preOpGas - The gas used for validation (including preValidationGas)
+ * @param prefund - The required prefund for this operation
+ * @param accountValidationData - returned validationData from account.
+ * @param paymasterValidationData - return validationData from paymaster.
+ * @param paymasterContext - Returned by validatePaymasterUserOp (to be passed into postOp)
+ */
+ struct ReturnInfo {
+ uint256 preOpGas;
+ uint256 prefund;
+ uint256 accountValidationData;
+ uint256 paymasterValidationData;
+ bytes paymasterContext;
+ }
+
+ /**
+ * Returned aggregated signature info:
+ * The aggregator returned by the account, and its current stake.
+ */
+ struct AggregatorStakeInfo {
+ address aggregator;
+ StakeInfo stakeInfo;
+ }
+
+ /**
+ * Get counterfactual sender address.
+ * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.
+ * This method always revert, and returns the address in SenderAddressResult error
+ * @param initCode - The constructor code to be passed into the UserOperation.
+ */
+ function getSenderAddress(bytes memory initCode) external;
+
+ error DelegateAndRevert(bool success, bytes ret);
+
+ /**
+ * Helper method for dry-run testing.
+ * @dev calling this method, the EntryPoint will make a delegatecall to the given data, and report (via revert) the result.
+ * The method always revert, so is only useful off-chain for dry run calls, in cases where state-override to replace
+ * actual EntryPoint code is less convenient.
+ * @param target a target contract to make a delegatecall from entrypoint
+ * @param data data to pass to target in a delegatecall
+ */
+ function delegateAndRevert(address target, bytes calldata data) external;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol
new file mode 100644
index 000000000..a5a894f21
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >=0.7.5;
+
+import "./PackedUserOperation.sol";
+import "./IEntryPoint.sol";
+
+interface IEntryPointSimulations is IEntryPoint {
+ // Return value of simulateHandleOp.
+ struct ExecutionResult {
+ uint256 preOpGas;
+ uint256 paid;
+ uint256 accountValidationData;
+ uint256 paymasterValidationData;
+ bool targetSuccess;
+ bytes targetResult;
+ }
+
+ /**
+ * Successful result from simulateValidation.
+ * If the account returns a signature aggregator the "aggregatorInfo" struct is filled in as well.
+ * @param returnInfo Gas and time-range returned values
+ * @param senderInfo Stake information about the sender
+ * @param factoryInfo Stake information about the factory (if any)
+ * @param paymasterInfo Stake information about the paymaster (if any)
+ * @param aggregatorInfo Signature aggregation info (if the account requires signature aggregator)
+ * Bundler MUST use it to verify the signature, or reject the UserOperation.
+ */
+ struct ValidationResult {
+ ReturnInfo returnInfo;
+ StakeInfo senderInfo;
+ StakeInfo factoryInfo;
+ StakeInfo paymasterInfo;
+ AggregatorStakeInfo aggregatorInfo;
+ }
+
+ /**
+ * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.
+ * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage
+ * outside the account's data.
+ * @param userOp - The user operation to validate.
+ * @return the validation result structure
+ */
+ function simulateValidation(
+ PackedUserOperation calldata userOp
+ )
+ external
+ returns (
+ ValidationResult memory
+ );
+
+ /**
+ * Simulate full execution of a UserOperation (including both validation and target execution)
+ * It performs full validation of the UserOperation, but ignores signature error.
+ * An optional target address is called after the userop succeeds,
+ * and its value is returned (before the entire call is reverted).
+ * Note that in order to collect the the success/failure of the target call, it must be executed
+ * with trace enabled to track the emitted events.
+ * @param op The UserOperation to simulate.
+ * @param target - If nonzero, a target address to call after userop simulation. If called,
+ * the targetSuccess and targetResult are set to the return from that call.
+ * @param targetCallData - CallData to pass to target address.
+ * @return the execution result structure
+ */
+ function simulateHandleOp(
+ PackedUserOperation calldata op,
+ address target,
+ bytes calldata targetCallData
+ )
+ external
+ returns (
+ ExecutionResult memory
+ );
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/INonceManager.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/INonceManager.sol
new file mode 100644
index 000000000..2f993f687
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/INonceManager.sol
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >=0.7.5;
+
+interface INonceManager {
+
+ /**
+ * Return the next nonce for this sender.
+ * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)
+ * But UserOp with different keys can come with arbitrary order.
+ *
+ * @param sender the account address
+ * @param key the high 192 bit of the nonce
+ * @return nonce a full nonce to pass for next UserOp with this sender.
+ */
+ function getNonce(address sender, uint192 key)
+ external view returns (uint256 nonce);
+
+ /**
+ * Manually increment the nonce of the sender.
+ * This method is exposed just for completeness..
+ * Account does NOT need to call it, neither during validation, nor elsewhere,
+ * as the EntryPoint will update the nonce regardless.
+ * Possible use-case is call it with various keys to "initialize" their nonces to one, so that future
+ * UserOperations will not pay extra for the first transaction with a given key.
+ */
+ function incrementNonce(uint192 key) external;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IPaymaster.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IPaymaster.sol
new file mode 100644
index 000000000..9176a0b24
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IPaymaster.sol
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >=0.7.5;
+
+import "./PackedUserOperation.sol";
+
+/**
+ * The interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.
+ * A paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.
+ */
+interface IPaymaster {
+ enum PostOpMode {
+ // User op succeeded.
+ opSucceeded,
+ // User op reverted. Still has to pay for gas.
+ opReverted,
+ // Only used internally in the EntryPoint (cleanup after postOp reverts). Never calling paymaster with this value
+ postOpReverted
+ }
+
+ /**
+ * Payment validation: check if paymaster agrees to pay.
+ * Must verify sender is the entryPoint.
+ * Revert to reject this request.
+ * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted).
+ * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.
+ * @param userOp - The user operation.
+ * @param userOpHash - Hash of the user's request data.
+ * @param maxCost - The maximum cost of this transaction (based on maximum gas and gas price from userOp).
+ * @return context - Value to send to a postOp. Zero length to signify postOp is not required.
+ * @return validationData - Signature and time-range of this operation, encoded the same as the return
+ * value of validateUserOperation.
+ * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,
+ * other values are invalid for paymaster.
+ * <6-byte> validUntil - last timestamp this operation is valid. 0 for "indefinite"
+ * <6-byte> validAfter - first timestamp this operation is valid
+ * Note that the validation code cannot use block.timestamp (or block.number) directly.
+ */
+ function validatePaymasterUserOp(
+ PackedUserOperation calldata userOp,
+ bytes32 userOpHash,
+ uint256 maxCost
+ ) external returns (bytes memory context, uint256 validationData);
+
+ /**
+ * Post-operation handler.
+ * Must verify sender is the entryPoint.
+ * @param mode - Enum with the following options:
+ * opSucceeded - User operation succeeded.
+ * opReverted - User op reverted. The paymaster still has to pay for gas.
+ * postOpReverted - never passed in a call to postOp().
+ * @param context - The context value returned by validatePaymasterUserOp
+ * @param actualGasCost - Actual gas used so far (without this postOp call).
+ * @param actualUserOpFeePerGas - the gas price this UserOp pays. This value is based on the UserOp's maxFeePerGas
+ * and maxPriorityFee (and basefee)
+ * It is not the same as tx.gasprice, which is what the bundler pays.
+ */
+ function postOp(
+ PostOpMode mode,
+ bytes calldata context,
+ uint256 actualGasCost,
+ uint256 actualUserOpFeePerGas
+ ) external;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IStakeManager.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IStakeManager.sol
new file mode 100644
index 000000000..69083e93f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IStakeManager.sol
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: GPL-3.0-only
+pragma solidity >=0.7.5;
+
+/**
+ * Manage deposits and stakes.
+ * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).
+ * Stake is value locked for at least "unstakeDelay" by the staked entity.
+ */
+interface IStakeManager {
+ event Deposited(address indexed account, uint256 totalDeposit);
+
+ event Withdrawn(
+ address indexed account,
+ address withdrawAddress,
+ uint256 amount
+ );
+
+ // Emitted when stake or unstake delay are modified.
+ event StakeLocked(
+ address indexed account,
+ uint256 totalStaked,
+ uint256 unstakeDelaySec
+ );
+
+ // Emitted once a stake is scheduled for withdrawal.
+ event StakeUnlocked(address indexed account, uint256 withdrawTime);
+
+ event StakeWithdrawn(
+ address indexed account,
+ address withdrawAddress,
+ uint256 amount
+ );
+
+ /**
+ * @param deposit - The entity's deposit.
+ * @param staked - True if this entity is staked.
+ * @param stake - Actual amount of ether staked for this entity.
+ * @param unstakeDelaySec - Minimum delay to withdraw the stake.
+ * @param withdrawTime - First block timestamp where 'withdrawStake' will be callable, or zero if already locked.
+ * @dev Sizes were chosen so that deposit fits into one cell (used during handleOp)
+ * and the rest fit into a 2nd cell (used during stake/unstake)
+ * - 112 bit allows for 10^15 eth
+ * - 48 bit for full timestamp
+ * - 32 bit allows 150 years for unstake delay
+ */
+ struct DepositInfo {
+ uint256 deposit;
+ bool staked;
+ uint112 stake;
+ uint32 unstakeDelaySec;
+ uint48 withdrawTime;
+ }
+
+ // API struct used by getStakeInfo and simulateValidation.
+ struct StakeInfo {
+ uint256 stake;
+ uint256 unstakeDelaySec;
+ }
+
+ /**
+ * Get deposit info.
+ * @param account - The account to query.
+ * @return info - Full deposit information of given account.
+ */
+ function getDepositInfo(
+ address account
+ ) external view returns (DepositInfo memory info);
+
+ /**
+ * Get account balance.
+ * @param account - The account to query.
+ * @return - The deposit (for gas payment) of the account.
+ */
+ function balanceOf(address account) external view returns (uint256);
+
+ /**
+ * Add to the deposit of the given account.
+ * @param account - The account to add to.
+ */
+ function depositTo(address account) external payable;
+
+ /**
+ * Add to the account's stake - amount and delay
+ * any pending unstake is first cancelled.
+ * @param _unstakeDelaySec - The new lock duration before the deposit can be withdrawn.
+ */
+ function addStake(uint32 _unstakeDelaySec) external payable;
+
+ /**
+ * Attempt to unlock the stake.
+ * The value can be withdrawn (using withdrawStake) after the unstake delay.
+ */
+ function unlockStake() external;
+
+ /**
+ * Withdraw from the (unlocked) stake.
+ * Must first call unlockStake and wait for the unstakeDelay to pass.
+ * @param withdrawAddress - The address to send withdrawn value.
+ */
+ function withdrawStake(address payable withdrawAddress) external;
+
+ /**
+ * Withdraw from the deposit.
+ * @param withdrawAddress - The address to send withdrawn value.
+ * @param withdrawAmount - The amount to withdraw.
+ */
+ function withdrawTo(
+ address payable withdrawAddress,
+ uint256 withdrawAmount
+ ) external;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol
new file mode 100644
index 000000000..fe20de565
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >=0.7.5;
+
+/**
+ * User Operation struct
+ * @param sender - The sender account of this request.
+ * @param nonce - Unique value the sender uses to verify it is not a replay.
+ * @param initCode - If set, the account contract will be created by this constructor/
+ * @param callData - The method call to execute on this account.
+ * @param accountGasLimits - Packed gas limits for validateUserOp and gas limit passed to the callData method call.
+ * @param preVerificationGas - Gas not calculated by the handleOps method, but added to the gas paid.
+ * Covers batch overhead.
+ * @param gasFees - packed gas fields maxPriorityFeePerGas and maxFeePerGas - Same as EIP-1559 gas parameters.
+ * @param paymasterAndData - If set, this field holds the paymaster address, verification gas limit, postOp gas limit and paymaster-specific extra data
+ * The paymaster will pay for the transaction instead of the sender.
+ * @param signature - Sender-verified signature over the entire request, the EntryPoint address and the chain ID.
+ */
+struct PackedUserOperation {
+ address sender;
+ uint256 nonce;
+ bytes initCode;
+ bytes callData;
+ bytes32 accountGasLimits;
+ uint256 preVerificationGas;
+ bytes32 gasFees;
+ bytes paymasterAndData;
+ bytes signature;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/package.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/package.json
new file mode 100644
index 000000000..bb1703cb7
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "@account-abstraction/contracts",
+ "description": "Account Abstraction (EIP 4337) contracts",
+ "version": "0.7.0",
+ "scripts": {
+ "prepack": "../scripts/prepack-contracts-package.sh",
+ "postpack": "../scripts/postpack-contracts-package.sh"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/eth-infinitism/account-abstraction"
+ },
+ "keywords": [
+ "solidity",
+ "ethereum",
+ "smart",
+ "contracts",
+ "account-abstraction",
+ "erc-4337"
+ ],
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/eth-infinitism/account-abstraction/issues"
+ },
+ "dependencies": {
+ "@openzeppelin/contracts": "^5.0.0",
+ "@uniswap/v3-periphery": "^1.4.3"
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/LegacyTokenPaymaster.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/LegacyTokenPaymaster.sol
new file mode 100644
index 000000000..1589696dd
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/LegacyTokenPaymaster.sol
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable reason-string */
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import "../core/BasePaymaster.sol";
+import "../core/UserOperationLib.sol";
+import "../core/Helpers.sol";
+
+/**
+ * A sample paymaster that defines itself as a token to pay for gas.
+ * The paymaster IS the token to use, since a paymaster cannot use an external contract.
+ * Also, the exchange rate has to be fixed, since it can't reference an external Uniswap or other exchange contract.
+ * subclass should override "getTokenValueOfEth" to provide actual token exchange rate, settable by the owner.
+ * Known Limitation: this paymaster is exploitable when put into a batch with multiple ops (of different accounts):
+ * - while a single op can't exploit the paymaster (if postOp fails to withdraw the tokens, the user's op is reverted,
+ * and then we know we can withdraw the tokens), multiple ops with different senders (all using this paymaster)
+ * in a batch can withdraw funds from 2nd and further ops, forcing the paymaster itself to pay (from its deposit)
+ * - Possible workarounds are either use a more complex paymaster scheme (e.g. the DepositPaymaster) or
+ * to whitelist the account and the called method ids.
+ */
+contract LegacyTokenPaymaster is BasePaymaster, ERC20 {
+ using UserOperationLib for PackedUserOperation;
+
+ //calculated cost of the postOp
+ uint256 constant public COST_OF_POST = 15000;
+
+ address public immutable theFactory;
+
+ constructor(address accountFactory, string memory _symbol, IEntryPoint _entryPoint) ERC20(_symbol, _symbol) BasePaymaster(_entryPoint) {
+ theFactory = accountFactory;
+ //make it non-empty
+ _mint(address(this), 1);
+
+ //owner is allowed to withdraw tokens from the paymaster's balance
+ _approve(address(this), msg.sender, type(uint256).max);
+ }
+
+
+ /**
+ * helpers for owner, to mint and withdraw tokens.
+ * @param recipient - the address that will receive the minted tokens.
+ * @param amount - the amount it will receive.
+ */
+ function mintTokens(address recipient, uint256 amount) external onlyOwner {
+ _mint(recipient, amount);
+ }
+
+ /**
+ * transfer paymaster ownership.
+ * owner of this paymaster is allowed to withdraw funds (tokens transferred to this paymaster's balance)
+ * when changing owner, the old owner's withdrawal rights are revoked.
+ */
+ function transferOwnership(address newOwner) public override virtual onlyOwner {
+ // remove allowance of current owner
+ _approve(address(this), owner(), 0);
+ super.transferOwnership(newOwner);
+ // new owner is allowed to withdraw tokens from the paymaster's balance
+ _approve(address(this), newOwner, type(uint256).max);
+ }
+
+ //Note: this method assumes a fixed ratio of token-to-eth. subclass should override to supply oracle
+ // or a setter.
+ function getTokenValueOfEth(uint256 valueEth) internal view virtual returns (uint256 valueToken) {
+ return valueEth / 100;
+ }
+
+ /**
+ * validate the request:
+ * if this is a constructor call, make sure it is a known account.
+ * verify the sender has enough tokens.
+ * (since the paymaster is also the token, there is no notion of "approval")
+ */
+ function _validatePaymasterUserOp(PackedUserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)
+ internal view override returns (bytes memory context, uint256 validationData) {
+ uint256 tokenPrefund = getTokenValueOfEth(requiredPreFund);
+
+ uint256 postOpGasLimit = userOp.unpackPostOpGasLimit();
+ require( postOpGasLimit > COST_OF_POST, "TokenPaymaster: gas too low for postOp");
+
+ if (userOp.initCode.length != 0) {
+ _validateConstructor(userOp);
+ require(balanceOf(userOp.sender) >= tokenPrefund, "TokenPaymaster: no balance (pre-create)");
+ } else {
+
+ require(balanceOf(userOp.sender) >= tokenPrefund, "TokenPaymaster: no balance");
+ }
+
+ return (abi.encode(userOp.sender), SIG_VALIDATION_SUCCESS);
+ }
+
+ // when constructing an account, validate constructor code and parameters
+ // we trust our factory (and that it doesn't have any other public methods)
+ function _validateConstructor(PackedUserOperation calldata userOp) internal virtual view {
+ address factory = address(bytes20(userOp.initCode[0 : 20]));
+ require(factory == theFactory, "TokenPaymaster: wrong account factory");
+ }
+
+ /**
+ * actual charge of user.
+ * this method will be called just after the user's TX with mode==OpSucceeded|OpReverted (account pays in both cases)
+ * BUT: if the user changed its balance in a way that will cause postOp to revert, then it gets called again, after reverting
+ * the user's TX , back to the state it was before the transaction started (before the validatePaymasterUserOp),
+ * and the transaction should succeed there.
+ */
+ function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost, uint256 actualUserOpFeePerGas) internal override {
+ //we don't really care about the mode, we just pay the gas with the user's tokens.
+ (mode);
+ address sender = abi.decode(context, (address));
+ uint256 charge = getTokenValueOfEth(actualGasCost + COST_OF_POST * actualUserOpFeePerGas);
+ //actualGasCost is known to be no larger than the above requiredPreFund, so the transfer should succeed.
+ _transfer(sender, address(this), charge);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/SimpleAccount.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/SimpleAccount.sol
new file mode 100644
index 000000000..61af6ca6b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/SimpleAccount.sol
@@ -0,0 +1,150 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable avoid-low-level-calls */
+/* solhint-disable no-inline-assembly */
+/* solhint-disable reason-string */
+
+import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
+import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
+import "../core/BaseAccount.sol";
+import "../core/Helpers.sol";
+import "./callback/TokenCallbackHandler.sol";
+
+/**
+ * minimal account.
+ * this is sample minimal account.
+ * has execute, eth handling methods
+ * has a single signer that can send requests through the entryPoint.
+ */
+contract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {
+ address public owner;
+
+ IEntryPoint private immutable _entryPoint;
+
+ event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);
+
+ modifier onlyOwner() {
+ _onlyOwner();
+ _;
+ }
+
+ /// @inheritdoc BaseAccount
+ function entryPoint() public view virtual override returns (IEntryPoint) {
+ return _entryPoint;
+ }
+
+ // solhint-disable-next-line no-empty-blocks
+ receive() external payable {}
+
+ constructor(IEntryPoint anEntryPoint) {
+ _entryPoint = anEntryPoint;
+ _disableInitializers();
+ }
+
+ function _onlyOwner() internal view {
+ //directly from EOA owner, or through the account itself (which gets redirected through execute())
+ require(msg.sender == owner || msg.sender == address(this), "only owner");
+ }
+
+ /**
+ * execute a transaction (called directly from owner, or by entryPoint)
+ * @param dest destination address to call
+ * @param value the value to pass in this call
+ * @param func the calldata to pass in this call
+ */
+ function execute(address dest, uint256 value, bytes calldata func) external {
+ _requireFromEntryPointOrOwner();
+ _call(dest, value, func);
+ }
+
+ /**
+ * execute a sequence of transactions
+ * @dev to reduce gas consumption for trivial case (no value), use a zero-length array to mean zero value
+ * @param dest an array of destination addresses
+ * @param value an array of values to pass to each call. can be zero-length for no-value calls
+ * @param func an array of calldata to pass to each call
+ */
+ function executeBatch(address[] calldata dest, uint256[] calldata value, bytes[] calldata func) external {
+ _requireFromEntryPointOrOwner();
+ require(dest.length == func.length && (value.length == 0 || value.length == func.length), "wrong array lengths");
+ if (value.length == 0) {
+ for (uint256 i = 0; i < dest.length; i++) {
+ _call(dest[i], 0, func[i]);
+ }
+ } else {
+ for (uint256 i = 0; i < dest.length; i++) {
+ _call(dest[i], value[i], func[i]);
+ }
+ }
+ }
+
+ /**
+ * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,
+ * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading
+ * the implementation by calling `upgradeTo()`
+ * @param anOwner the owner (signer) of this account
+ */
+ function initialize(address anOwner) public virtual initializer {
+ _initialize(anOwner);
+ }
+
+ function _initialize(address anOwner) internal virtual {
+ owner = anOwner;
+ emit SimpleAccountInitialized(_entryPoint, owner);
+ }
+
+ // Require the function call went through EntryPoint or owner
+ function _requireFromEntryPointOrOwner() internal view {
+ require(msg.sender == address(entryPoint()) || msg.sender == owner, "account: not Owner or EntryPoint");
+ }
+
+ /// implement template method of BaseAccount
+ function _validateSignature(PackedUserOperation calldata userOp, bytes32 userOpHash)
+ internal override virtual returns (uint256 validationData) {
+ bytes32 hash = MessageHashUtils.toEthSignedMessageHash(userOpHash);
+ if (owner != ECDSA.recover(hash, userOp.signature))
+ return SIG_VALIDATION_FAILED;
+ return SIG_VALIDATION_SUCCESS;
+ }
+
+ function _call(address target, uint256 value, bytes memory data) internal {
+ (bool success, bytes memory result) = target.call{value: value}(data);
+ if (!success) {
+ assembly {
+ revert(add(result, 32), mload(result))
+ }
+ }
+ }
+
+ /**
+ * check current account deposit in the entryPoint
+ */
+ function getDeposit() public view returns (uint256) {
+ return entryPoint().balanceOf(address(this));
+ }
+
+ /**
+ * deposit more funds for this account in the entryPoint
+ */
+ function addDeposit() public payable {
+ entryPoint().depositTo{value: msg.value}(address(this));
+ }
+
+ /**
+ * withdraw value from the account's deposit
+ * @param withdrawAddress target to send to
+ * @param amount to withdraw
+ */
+ function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {
+ entryPoint().withdrawTo(withdrawAddress, amount);
+ }
+
+ function _authorizeUpgrade(address newImplementation) internal view override {
+ (newImplementation);
+ _onlyOwner();
+ }
+}
+
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/SimpleAccountFactory.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/SimpleAccountFactory.sol
new file mode 100644
index 000000000..5afa2ce60
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/SimpleAccountFactory.sol
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+import "@openzeppelin/contracts/utils/Create2.sol";
+import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
+
+import "./SimpleAccount.sol";
+
+/**
+ * A sample factory contract for SimpleAccount
+ * A UserOperations "initCode" holds the address of the factory, and a method call (to createAccount, in this sample factory).
+ * The factory's createAccount returns the target account address even if it is already installed.
+ * This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.
+ */
+contract SimpleAccountFactory {
+ SimpleAccount public immutable accountImplementation;
+
+ constructor(IEntryPoint _entryPoint) {
+ accountImplementation = new SimpleAccount(_entryPoint);
+ }
+
+ /**
+ * create an account, and return its address.
+ * returns the address even if the account is already deployed.
+ * Note that during UserOperation execution, this method is called only if the account is not deployed.
+ * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation
+ */
+ function createAccount(address owner,uint256 salt) public returns (SimpleAccount ret) {
+ address addr = getAddress(owner, salt);
+ uint256 codeSize = addr.code.length;
+ if (codeSize > 0) {
+ return SimpleAccount(payable(addr));
+ }
+ ret = SimpleAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(
+ address(accountImplementation),
+ abi.encodeCall(SimpleAccount.initialize, (owner))
+ )));
+ }
+
+ /**
+ * calculate the counterfactual address of this account as it would be returned by createAccount()
+ */
+ function getAddress(address owner,uint256 salt) public view returns (address) {
+ return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(
+ type(ERC1967Proxy).creationCode,
+ abi.encode(
+ address(accountImplementation),
+ abi.encodeCall(SimpleAccount.initialize, (owner))
+ )
+ )));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/TokenPaymaster.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/TokenPaymaster.sol
new file mode 100644
index 000000000..1d4c50d63
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/TokenPaymaster.sol
@@ -0,0 +1,217 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+// Import the required libraries and contracts
+import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
+import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
+
+import "../interfaces/IEntryPoint.sol";
+import "../core/BasePaymaster.sol";
+import "../core/Helpers.sol";
+import "./utils/UniswapHelper.sol";
+import "./utils/OracleHelper.sol";
+
+/// @title Sample ERC-20 Token Paymaster for ERC-4337
+/// This Paymaster covers gas fees in exchange for ERC20 tokens charged using allowance pre-issued by ERC-4337 accounts.
+/// The contract refunds excess tokens if the actual gas cost is lower than the initially provided amount.
+/// The token price cannot be queried in the validation code due to storage access restrictions of ERC-4337.
+/// The price is cached inside the contract and is updated in the 'postOp' stage if the change is >10%.
+/// It is theoretically possible the token has depreciated so much since the last 'postOp' the refund becomes negative.
+/// The contract reverts the inner user transaction in that case but keeps the charge.
+/// The contract also allows honest clients to prepay tokens at a higher price to avoid getting reverted.
+/// It also allows updating price configuration and withdrawing tokens by the contract owner.
+/// The contract uses an Oracle to fetch the latest token prices.
+/// @dev Inherits from BasePaymaster.
+contract TokenPaymaster is BasePaymaster, UniswapHelper, OracleHelper {
+
+ using UserOperationLib for PackedUserOperation;
+
+ struct TokenPaymasterConfig {
+ /// @notice The price markup percentage applied to the token price (1e26 = 100%). Ranges from 1e26 to 2e26
+ uint256 priceMarkup;
+
+ /// @notice Exchange tokens to native currency if the EntryPoint balance of this Paymaster falls below this value
+ uint128 minEntryPointBalance;
+
+ /// @notice Estimated gas cost for refunding tokens after the transaction is completed
+ uint48 refundPostopCost;
+
+ /// @notice Transactions are only valid as long as the cached price is not older than this value
+ uint48 priceMaxAge;
+ }
+
+ event ConfigUpdated(TokenPaymasterConfig tokenPaymasterConfig);
+
+ event UserOperationSponsored(address indexed user, uint256 actualTokenCharge, uint256 actualGasCost, uint256 actualTokenPriceWithMarkup);
+
+ event Received(address indexed sender, uint256 value);
+
+ /// @notice All 'price' variables are multiplied by this value to avoid rounding up
+ uint256 private constant PRICE_DENOMINATOR = 1e26;
+
+ TokenPaymasterConfig public tokenPaymasterConfig;
+
+ /// @notice Initializes the TokenPaymaster contract with the given parameters.
+ /// @param _token The ERC20 token used for transaction fee payments.
+ /// @param _entryPoint The EntryPoint contract used in the Account Abstraction infrastructure.
+ /// @param _wrappedNative The ERC-20 token that wraps the native asset for current chain.
+ /// @param _uniswap The Uniswap V3 SwapRouter contract.
+ /// @param _tokenPaymasterConfig The configuration for the Token Paymaster.
+ /// @param _oracleHelperConfig The configuration for the Oracle Helper.
+ /// @param _uniswapHelperConfig The configuration for the Uniswap Helper.
+ /// @param _owner The address that will be set as the owner of the contract.
+ constructor(
+ IERC20Metadata _token,
+ IEntryPoint _entryPoint,
+ IERC20 _wrappedNative,
+ ISwapRouter _uniswap,
+ TokenPaymasterConfig memory _tokenPaymasterConfig,
+ OracleHelperConfig memory _oracleHelperConfig,
+ UniswapHelperConfig memory _uniswapHelperConfig,
+ address _owner
+ )
+ BasePaymaster(
+ _entryPoint
+ )
+ OracleHelper(
+ _oracleHelperConfig
+ )
+ UniswapHelper(
+ _token,
+ _wrappedNative,
+ _uniswap,
+ _uniswapHelperConfig
+ )
+ {
+ setTokenPaymasterConfig(_tokenPaymasterConfig);
+ transferOwnership(_owner);
+ }
+
+ /// @notice Updates the configuration for the Token Paymaster.
+ /// @param _tokenPaymasterConfig The new configuration struct.
+ function setTokenPaymasterConfig(
+ TokenPaymasterConfig memory _tokenPaymasterConfig
+ ) public onlyOwner {
+ require(_tokenPaymasterConfig.priceMarkup <= 2 * PRICE_DENOMINATOR, "TPM: price markup too high");
+ require(_tokenPaymasterConfig.priceMarkup >= PRICE_DENOMINATOR, "TPM: price markup too low");
+ tokenPaymasterConfig = _tokenPaymasterConfig;
+ emit ConfigUpdated(_tokenPaymasterConfig);
+ }
+
+ function setUniswapConfiguration(
+ UniswapHelperConfig memory _uniswapHelperConfig
+ ) external onlyOwner {
+ _setUniswapHelperConfiguration(_uniswapHelperConfig);
+ }
+
+ /// @notice Allows the contract owner to withdraw a specified amount of tokens from the contract.
+ /// @param to The address to transfer the tokens to.
+ /// @param amount The amount of tokens to transfer.
+ function withdrawToken(address to, uint256 amount) external onlyOwner {
+ SafeERC20.safeTransfer(token, to, amount);
+ }
+
+ /// @notice Validates a paymaster user operation and calculates the required token amount for the transaction.
+ /// @param userOp The user operation data.
+ /// @param requiredPreFund The maximum cost (in native token) the paymaster has to prefund.
+ /// @return context The context containing the token amount and user sender address (if applicable).
+ /// @return validationResult A uint256 value indicating the result of the validation (always 0 in this implementation).
+ function _validatePaymasterUserOp(PackedUserOperation calldata userOp, bytes32, uint256 requiredPreFund)
+ internal
+ override
+ returns (bytes memory context, uint256 validationResult) {unchecked {
+ uint256 priceMarkup = tokenPaymasterConfig.priceMarkup;
+ uint256 dataLength = userOp.paymasterAndData.length - PAYMASTER_DATA_OFFSET;
+ require(dataLength == 0 || dataLength == 32,
+ "TPM: invalid data length"
+ );
+ uint256 maxFeePerGas = userOp.unpackMaxFeePerGas();
+ uint256 refundPostopCost = tokenPaymasterConfig.refundPostopCost;
+ require(refundPostopCost < userOp.unpackPostOpGasLimit(), "TPM: postOpGasLimit too low");
+ uint256 preChargeNative = requiredPreFund + (refundPostopCost * maxFeePerGas);
+ // note: as price is in native-asset-per-token and we want more tokens increasing it means dividing it by markup
+ uint256 cachedPriceWithMarkup = cachedPrice * PRICE_DENOMINATOR / priceMarkup;
+ if (dataLength == 32) {
+ uint256 clientSuppliedPrice = uint256(bytes32(userOp.paymasterAndData[PAYMASTER_DATA_OFFSET : PAYMASTER_DATA_OFFSET + 32]));
+ if (clientSuppliedPrice < cachedPriceWithMarkup) {
+ // note: smaller number means 'more native asset per token'
+ cachedPriceWithMarkup = clientSuppliedPrice;
+ }
+ }
+ uint256 tokenAmount = weiToToken(preChargeNative, cachedPriceWithMarkup);
+ SafeERC20.safeTransferFrom(token, userOp.sender, address(this), tokenAmount);
+ context = abi.encode(tokenAmount, userOp.sender);
+ validationResult = _packValidationData(
+ false,
+ uint48(cachedPriceTimestamp + tokenPaymasterConfig.priceMaxAge),
+ 0
+ );
+ }
+ }
+
+ /// @notice Performs post-operation tasks, such as updating the token price and refunding excess tokens.
+ /// @dev This function is called after a user operation has been executed or reverted.
+ /// @param context The context containing the token amount and user sender address.
+ /// @param actualGasCost The actual gas cost of the transaction.
+ /// @param actualUserOpFeePerGas - the gas price this UserOp pays. This value is based on the UserOp's maxFeePerGas
+ // and maxPriorityFee (and basefee)
+ // It is not the same as tx.gasprice, which is what the bundler pays.
+ function _postOp(PostOpMode, bytes calldata context, uint256 actualGasCost, uint256 actualUserOpFeePerGas) internal override {
+ unchecked {
+ uint256 priceMarkup = tokenPaymasterConfig.priceMarkup;
+ (
+ uint256 preCharge,
+ address userOpSender
+ ) = abi.decode(context, (uint256, address));
+ uint256 _cachedPrice = updateCachedPrice(false);
+ // note: as price is in native-asset-per-token and we want more tokens increasing it means dividing it by markup
+ uint256 cachedPriceWithMarkup = _cachedPrice * PRICE_DENOMINATOR / priceMarkup;
+ // Refund tokens based on actual gas cost
+ uint256 actualChargeNative = actualGasCost + tokenPaymasterConfig.refundPostopCost * actualUserOpFeePerGas;
+ uint256 actualTokenNeeded = weiToToken(actualChargeNative, cachedPriceWithMarkup);
+ if (preCharge > actualTokenNeeded) {
+ // If the initially provided token amount is greater than the actual amount needed, refund the difference
+ SafeERC20.safeTransfer(
+ token,
+ userOpSender,
+ preCharge - actualTokenNeeded
+ );
+ } else if (preCharge < actualTokenNeeded) {
+ // Attempt to cover Paymaster's gas expenses by withdrawing the 'overdraft' from the client
+ // If the transfer reverts also revert the 'postOp' to remove the incentive to cheat
+ SafeERC20.safeTransferFrom(
+ token,
+ userOpSender,
+ address(this),
+ actualTokenNeeded - preCharge
+ );
+ }
+
+ emit UserOperationSponsored(userOpSender, actualTokenNeeded, actualGasCost, cachedPriceWithMarkup);
+ refillEntryPointDeposit(_cachedPrice);
+ }
+ }
+
+ /// @notice If necessary this function uses this Paymaster's token balance to refill the deposit on EntryPoint
+ /// @param _cachedPrice the token price that will be used to calculate the swap amount.
+ function refillEntryPointDeposit(uint256 _cachedPrice) private {
+ uint256 currentEntryPointBalance = entryPoint.balanceOf(address(this));
+ if (
+ currentEntryPointBalance < tokenPaymasterConfig.minEntryPointBalance
+ ) {
+ uint256 swappedWeth = _maybeSwapTokenToWeth(token, _cachedPrice);
+ unwrapWeth(swappedWeth);
+ entryPoint.depositTo{value: address(this).balance}(address(this));
+ }
+ }
+
+ receive() external payable {
+ emit Received(msg.sender, msg.value);
+ }
+
+ function withdrawEth(address payable recipient, uint256 amount) external onlyOwner {
+ (bool success,) = recipient.call{value: amount}("");
+ require(success, "withdraw failed");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/VerifyingPaymaster.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/VerifyingPaymaster.sol
new file mode 100644
index 000000000..1ddce2f47
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/VerifyingPaymaster.sol
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable reason-string */
+/* solhint-disable no-inline-assembly */
+
+import "../core/BasePaymaster.sol";
+import "../core/UserOperationLib.sol";
+import "../core/Helpers.sol";
+import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
+/**
+ * A sample paymaster that uses external service to decide whether to pay for the UserOp.
+ * The paymaster trusts an external signer to sign the transaction.
+ * The calling user must pass the UserOp to that external signer first, which performs
+ * whatever off-chain verification before signing the UserOp.
+ * Note that this signature is NOT a replacement for the account-specific signature:
+ * - the paymaster checks a signature to agree to PAY for GAS.
+ * - the account checks a signature to prove identity and account ownership.
+ */
+contract VerifyingPaymaster is BasePaymaster {
+
+ using UserOperationLib for PackedUserOperation;
+
+ address public immutable verifyingSigner;
+
+ uint256 private constant VALID_TIMESTAMP_OFFSET = PAYMASTER_DATA_OFFSET;
+
+ uint256 private constant SIGNATURE_OFFSET = VALID_TIMESTAMP_OFFSET + 64;
+
+ constructor(IEntryPoint _entryPoint, address _verifyingSigner) BasePaymaster(_entryPoint) {
+ verifyingSigner = _verifyingSigner;
+ }
+
+ /**
+ * return the hash we're going to sign off-chain (and validate on-chain)
+ * this method is called by the off-chain service, to sign the request.
+ * it is called on-chain from the validatePaymasterUserOp, to validate the signature.
+ * note that this signature covers all fields of the UserOperation, except the "paymasterAndData",
+ * which will carry the signature itself.
+ */
+ function getHash(PackedUserOperation calldata userOp, uint48 validUntil, uint48 validAfter)
+ public view returns (bytes32) {
+ //can't use userOp.hash(), since it contains also the paymasterAndData itself.
+ address sender = userOp.getSender();
+ return
+ keccak256(
+ abi.encode(
+ sender,
+ userOp.nonce,
+ keccak256(userOp.initCode),
+ keccak256(userOp.callData),
+ userOp.accountGasLimits,
+ uint256(bytes32(userOp.paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_DATA_OFFSET])),
+ userOp.preVerificationGas,
+ userOp.gasFees,
+ block.chainid,
+ address(this),
+ validUntil,
+ validAfter
+ )
+ );
+ }
+
+ /**
+ * verify our external signer signed this request.
+ * the "paymasterAndData" is expected to be the paymaster and a signature over the entire request params
+ * paymasterAndData[:20] : address(this)
+ * paymasterAndData[20:84] : abi.encode(validUntil, validAfter)
+ * paymasterAndData[84:] : signature
+ */
+ function _validatePaymasterUserOp(PackedUserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)
+ internal view override returns (bytes memory context, uint256 validationData) {
+ (requiredPreFund);
+
+ (uint48 validUntil, uint48 validAfter, bytes calldata signature) = parsePaymasterAndData(userOp.paymasterAndData);
+ //ECDSA library supports both 64 and 65-byte long signatures.
+ // we only "require" it here so that the revert reason on invalid signature will be of "VerifyingPaymaster", and not "ECDSA"
+ require(signature.length == 64 || signature.length == 65, "VerifyingPaymaster: invalid signature length in paymasterAndData");
+ bytes32 hash = MessageHashUtils.toEthSignedMessageHash(getHash(userOp, validUntil, validAfter));
+
+ //don't revert on signature failure: return SIG_VALIDATION_FAILED
+ if (verifyingSigner != ECDSA.recover(hash, signature)) {
+ return ("", _packValidationData(true, validUntil, validAfter));
+ }
+
+ //no need for other on-chain validation: entire UserOp should have been checked
+ // by the external service prior to signing it.
+ return ("", _packValidationData(false, validUntil, validAfter));
+ }
+
+ function parsePaymasterAndData(bytes calldata paymasterAndData) public pure returns (uint48 validUntil, uint48 validAfter, bytes calldata signature) {
+ (validUntil, validAfter) = abi.decode(paymasterAndData[VALID_TIMESTAMP_OFFSET :], (uint48, uint48));
+ signature = paymasterAndData[SIGNATURE_OFFSET :];
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSAccount.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSAccount.sol
new file mode 100644
index 000000000..cd480a792
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSAccount.sol
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+import "../SimpleAccount.sol";
+import "./IBLSAccount.sol";
+import "../../core/Helpers.sol";
+
+/**
+ * Minimal BLS-based account that uses an aggregated signature.
+ * The account must maintain its own BLS public key, and expose its trusted signature aggregator.
+ * Note that unlike the "standard" SimpleAccount, this account can't be called directly
+ * (normal SimpleAccount uses its "signer" address as both the ecrecover signer, and as a legitimate
+ * Ethereum sender address. Obviously, a BLS public key is not a valid Ethereum sender address.)
+ */
+contract BLSAccount is SimpleAccount, IBLSAccount {
+ address public immutable aggregator;
+ uint256[4] private publicKey;
+
+ // The constructor is used only for the "implementation" and only sets immutable values.
+ // Mutable value slots for proxy accounts are set by the 'initialize' function.
+ constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {
+ aggregator = anAggregator;
+ }
+
+ /**
+ * The initializer for the BLSAccount instance.
+ * @param aPublicKey public key from a BLS keypair that will have a full ownership and control of this account.
+ */
+ function initialize(uint256[4] memory aPublicKey) public virtual initializer {
+ super._initialize(address(0));
+ _setBlsPublicKey(aPublicKey);
+ }
+
+ function _validateSignature(PackedUserOperation calldata userOp, bytes32 userOpHash)
+ internal override view returns (uint256 validationData) {
+
+ (userOp, userOpHash);
+ if (userOp.initCode.length != 0) {
+ // BLSSignatureAggregator.getUserOpPublicKey() assumes that during account creation, the public key is
+ // the suffix of the initCode.
+ // The account MUST validate it
+ bytes32 pubKeyHash = keccak256(abi.encode(getBlsPublicKey()));
+ require(keccak256(userOp.initCode[userOp.initCode.length - 128 :]) == pubKeyHash, "wrong pubkey");
+ }
+ return _packValidationData(ValidationData(aggregator, 0,0));
+ }
+
+ /**
+ * Allows the owner to set or change the BLS key.
+ * @param newPublicKey public key from a BLS keypair that will have a full ownership and control of this account.
+ */
+ function setBlsPublicKey(uint256[4] memory newPublicKey) public onlyOwner {
+ _setBlsPublicKey(newPublicKey);
+ }
+
+ function _setBlsPublicKey(uint256[4] memory newPublicKey) internal {
+ emit PublicKeyChanged(publicKey, newPublicKey);
+ publicKey = newPublicKey;
+ }
+
+ /// @inheritdoc IBLSAccount
+ function getBlsPublicKey() public override view returns (uint256[4] memory) {
+ return publicKey;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSAccountFactory.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSAccountFactory.sol
new file mode 100644
index 000000000..95947142f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSAccountFactory.sol
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+import "@openzeppelin/contracts/utils/Create2.sol";
+import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
+
+import "../../interfaces/IEntryPoint.sol";
+import "./BLSAccount.sol";
+
+/* solhint-disable no-inline-assembly */
+
+/**
+ * Based on SimpleAccountFactory.
+ * Cannot be a subclass since both constructor and createAccount depend on the
+ * constructor and initializer of the actual account contract.
+ */
+contract BLSAccountFactory {
+ BLSAccount public immutable accountImplementation;
+
+ constructor(IEntryPoint entryPoint, address aggregator){
+ accountImplementation = new BLSAccount(entryPoint, aggregator);
+ }
+
+ /**
+ * create an account, and return its address.
+ * returns the address even if the account is already deployed.
+ * Note that during UserOperation execution, this method is called only if the account is not deployed.
+ * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation
+ * Also note that our BLSSignatureAggregator requires that the public key is the last parameter
+ */
+ function createAccount(uint256 salt, uint256[4] calldata aPublicKey) public returns (BLSAccount) {
+
+ // the BLSSignatureAggregator depends on the public-key being the last 4 uint256 of msg.data.
+ uint256 slot;
+ assembly {slot := aPublicKey}
+ require(slot == msg.data.length - 128, "wrong pubkey offset");
+
+ address addr = getAddress(salt, aPublicKey);
+ uint256 codeSize = addr.code.length;
+ if (codeSize > 0) {
+ return BLSAccount(payable(addr));
+ }
+ return BLSAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(
+ address(accountImplementation),
+ abi.encodeCall(BLSAccount.initialize, aPublicKey)
+ )));
+ }
+
+ /**
+ * calculate the counterfactual address of this account as it would be returned by createAccount()
+ */
+ function getAddress(uint256 salt, uint256[4] memory aPublicKey) public view returns (address) {
+ return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(
+ type(ERC1967Proxy).creationCode,
+ abi.encode(
+ address(accountImplementation),
+ abi.encodeCall(BLSAccount.initialize, (aPublicKey))
+ )
+ )));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSHelper.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSHelper.sol
new file mode 100644
index 000000000..a1a197134
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSHelper.sol
@@ -0,0 +1,232 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+// code taken from : https://github.com/witnet/elliptic-curve-solidity/blob/master/contracts/EllipticCurve.sol
+// missing core functions from "thehubbleproject/bls": jacAdd (and sum)
+library BLSHelper {
+
+ struct XY {
+ uint256 x;
+ uint256 y;
+ }
+ /**
+ * sum all the points in the array
+ * NOTE: the "ecAdd" (below) has a special case where x1==y2.
+ * @param points an array of bytes32[2], representing an (x,y) of a point
+ * @param _pp the modulus of the curve
+ * @return ret the sum of all points
+ */
+ function sum(XY[] memory points, uint256 _pp) internal pure returns (XY memory ret){
+ uint256 x = points[0].x;
+ uint256 y = points[0].y;
+ uint256 z = 1;
+
+ for (uint256 i = 1; i < points.length; i++) {
+ (x, y, z) = jacAdd(x, y, z, points[i].x, points[i].y, 1, _pp);
+ }
+ (x, y) = toAffine(x, y, z, _pp);
+ ret.x = x;
+ ret.y = y;
+ }
+
+ /// @dev Adds two points (x1, y1, z1) and (x2, y2, z2).
+ /// @param _x1 coordinate x of P1
+ /// @param _y1 coordinate y of P1
+ /// @param _z1 coordinate z of P1
+ /// @param _x2 coordinate x of square
+ /// @param _y2 coordinate y of square
+ /// @param _z2 coordinate z of square
+ /// @param _pp the modulus
+ /// @return (qx, qy, qz) P1+square in Jacobian
+ function jacAdd(
+ uint256 _x1,
+ uint256 _y1,
+ uint256 _z1,
+ uint256 _x2,
+ uint256 _y2,
+ uint256 _z2,
+ uint256 _pp)
+ internal pure returns (uint256, uint256, uint256)
+ {
+ if (_x1 == 0 && _y1 == 0)
+ return (_x2, _y2, _z2);
+ if (_x2 == 0 && _y2 == 0)
+ return (_x1, _y1, _z1);
+
+ // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5
+ uint256[4] memory zs;
+ // z1^2, z1^3, z2^2, z2^3
+ zs[0] = mulmod(_z1, _z1, _pp);
+ zs[1] = mulmod(_z1, zs[0], _pp);
+ zs[2] = mulmod(_z2, _z2, _pp);
+ zs[3] = mulmod(_z2, zs[2], _pp);
+
+ // u1, s1, u2, s2
+ zs = [
+ mulmod(_x1, zs[2], _pp),
+ mulmod(_y1, zs[3], _pp),
+ mulmod(_x2, zs[0], _pp),
+ mulmod(_y2, zs[1], _pp)
+ ];
+
+ // In case of zs[0] == zs[2] && zs[1] == zs[3], double function should be used
+ require(zs[0] != zs[2] || zs[1] != zs[3], "Use jacDouble function instead");
+
+ uint256[4] memory hr;
+ //h
+ hr[0] = addmod(zs[2], _pp - zs[0], _pp);
+ //r
+ hr[1] = addmod(zs[3], _pp - zs[1], _pp);
+ //h^2
+ hr[2] = mulmod(hr[0], hr[0], _pp);
+ // h^3
+ hr[3] = mulmod(hr[2], hr[0], _pp);
+ // qx = -h^3 -2u1h^2+r^2
+ uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp);
+ qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp);
+ // qy = -s1*z1*h^3+r(u1*h^2 -x^3)
+ uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp);
+ qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp);
+ // qz = h*z1*z2
+ uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp);
+ return (qx, qy, qz);
+ }
+
+
+ /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1).
+ /// @param _x coordinate x
+ /// @param _y coordinate y
+ /// @param _z coordinate z
+ /// @param _pp the modulus
+ /// @return (x', y') affine coordinates
+ function toAffine(
+ uint256 _x,
+ uint256 _y,
+ uint256 _z,
+ uint256 _pp)
+ internal pure returns (uint256, uint256)
+ {
+ uint256 zInv = invMod(_z, _pp);
+ uint256 zInv2 = mulmod(zInv, zInv, _pp);
+ uint256 x2 = mulmod(_x, zInv2, _pp);
+ uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp);
+
+ return (x2, y2);
+ }
+
+
+ /// @dev Modular euclidean inverse of a number (mod p).
+ /// @param _x The number
+ /// @param _pp The modulus
+ /// @return q such that x*q = 1 (mod _pp)
+ function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) {
+ require(_x != 0 && _x != _pp && _pp != 0, "Invalid number");
+ uint256 q = 0;
+ uint256 newT = 1;
+ uint256 r = _pp;
+ uint256 t;
+ while (_x != 0) {
+ t = r / _x;
+ (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp));
+ (r, _x) = (_x, r - t * _x);
+ }
+
+ return q;
+ }
+
+ /// @dev Doubles a point (x, y, z).
+ /// @param _x coordinate x of P1
+ /// @param _y coordinate y of P1
+ /// @param _z coordinate z of P1
+ /// @param _aa the a scalar in the curve equation
+ /// @param _pp the modulus
+ /// @return (qx, qy, qz) 2P in Jacobian
+ function jacDouble(
+ uint256 _x,
+ uint256 _y,
+ uint256 _z,
+ uint256 _aa,
+ uint256 _pp)
+ internal pure returns (uint256, uint256, uint256)
+ {
+ if (_z == 0)
+ return (_x, _y, _z);
+
+ // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5
+ // Note: there is a bug in the paper regarding the m parameter, M=3*(x1^2)+a*(z1^4)
+ // x, y, z at this point represent the squares of _x, _y, _z
+ uint256 x = mulmod(_x, _x, _pp); //x1^2
+ uint256 y = mulmod(_y, _y, _pp); //y1^2
+ uint256 z = mulmod(_z, _z, _pp); //z1^2
+
+ // s
+ uint256 s = mulmod(4, mulmod(_x, y, _pp), _pp);
+ // m
+ uint256 m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp);
+
+ // x, y, z at this point will be reassigned and rather represent qx, qy, qz from the paper
+ // This allows to reduce the gas cost and stack footprint of the algorithm
+ // qx
+ x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp);
+ // qy = -8*y1^4 + M(S-T)
+ y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp);
+ // qz = 2*y1*z1
+ z = mulmod(2, mulmod(_y, _z, _pp), _pp);
+
+ return (x, y, z);
+ }
+
+ /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates.
+ /// @param _x1 coordinate x of P1
+ /// @param _y1 coordinate y of P1
+ /// @param _x2 coordinate x of P2
+ /// @param _y2 coordinate y of P2
+ /// @param _aa constant of the curve
+ /// @param _pp the modulus
+ /// @return (qx, qy) = P1+P2 in affine coordinates
+ function ecAdd(
+ uint256 _x1,
+ uint256 _y1,
+ uint256 _x2,
+ uint256 _y2,
+ uint256 _aa,
+ uint256 _pp)
+ internal pure returns (uint256, uint256)
+ {
+ uint256 x = 0;
+ uint256 y = 0;
+ uint256 z = 0;
+
+ // Double if x1==x2 else add
+ if (_x1 == _x2) {
+ // y1 = -y2 mod p
+ if (addmod(_y1, _y2, _pp) == 0) {
+ return (0, 0);
+ } else {
+ // P1 = P2
+ (x, y, z) = jacDouble(
+ _x1,
+ _y1,
+ 1,
+ _aa,
+ _pp);
+ }
+ } else {
+ (x, y, z) = jacAdd(
+ _x1,
+ _y1,
+ 1,
+ _x2,
+ _y2,
+ 1,
+ _pp);
+ }
+ // Get back to affine
+ return toAffine(
+ x,
+ y,
+ z,
+ _pp);
+ }
+
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSSignatureAggregator.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSSignatureAggregator.sol
new file mode 100644
index 000000000..a2ac0f325
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSSignatureAggregator.sol
@@ -0,0 +1,171 @@
+//SPDX-License-Identifier: Unlicense
+pragma solidity ^0.8.23;
+
+import "../../interfaces/IAggregator.sol";
+import "../../interfaces/IEntryPoint.sol";
+import "../../core/UserOperationLib.sol";
+import {BLSOpen} from "./lib/BLSOpen.sol";
+import "./IBLSAccount.sol";
+import "./BLSHelper.sol";
+
+/**
+ * A BLS-based signature aggregator, to validate aggregated signature of multiple UserOps if BLSAccount
+ */
+contract BLSSignatureAggregator is IAggregator {
+ using UserOperationLib for PackedUserOperation;
+
+ bytes32 public constant BLS_DOMAIN = keccak256("eip4337.bls.domain");
+
+ //copied from BLS.sol
+ uint256 public constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
+
+ address public immutable entryPoint;
+
+ constructor(address _entryPoint) {
+ entryPoint = _entryPoint;
+ }
+
+ /**
+ * return the public key of this account.
+ * @param userOp the UserOperation that we need the account's public key for.
+ * @return publicKey - the public key from a BLS keypair the Aggregator will use to verify this UserOp;
+ * normally public key will be queried from the deployed BLSAccount itself;
+ * the public key will be read from the 'initCode' if the account is not deployed yet;
+ */
+ function getUserOpPublicKey(PackedUserOperation memory userOp) public view returns (uint256[4] memory publicKey) {
+ bytes memory initCode = userOp.initCode;
+ if (initCode.length > 0) {
+ publicKey = getTrailingPublicKey(initCode);
+ } else {
+ return IBLSAccount(userOp.sender).getBlsPublicKey{gas : 50000}();
+ }
+ }
+
+ /**
+ * return the trailing 4 words of input data
+ */
+ function getTrailingPublicKey(bytes memory data) public pure returns (uint256[4] memory publicKey) {
+ uint256 len = data.length;
+ require(len > 32 * 4, "data too short for sig");
+
+ /* solhint-disable-next-line no-inline-assembly */
+ assembly {
+ // actual buffer starts at data+32, so last 128 bytes start at data+32+len-128 = data+len-96
+ let ofs := sub(add(data, len), 96)
+ mstore(publicKey, mload(ofs))
+ mstore(add(publicKey, 32), mload(add(ofs, 32)))
+ mstore(add(publicKey, 64), mload(add(ofs, 64)))
+ mstore(add(publicKey, 96), mload(add(ofs, 96)))
+ }
+ }
+
+ /// @inheritdoc IAggregator
+ function validateSignatures(PackedUserOperation[] calldata userOps, bytes calldata signature)
+ external view override {
+ require(signature.length == 64, "BLS: invalid signature");
+ (uint256[2] memory blsSignature) = abi.decode(signature, (uint256[2]));
+
+ uint256 userOpsLen = userOps.length;
+ uint256[4][] memory blsPublicKeys = new uint256[4][](userOpsLen);
+ uint256[2][] memory messages = new uint256[2][](userOpsLen);
+ for (uint256 i = 0; i < userOpsLen; i++) {
+
+ PackedUserOperation memory userOp = userOps[i];
+ blsPublicKeys[i] = getUserOpPublicKey(userOp);
+
+ messages[i] = _userOpToMessage(userOp, _getPublicKeyHash(blsPublicKeys[i]));
+ }
+ require(BLSOpen.verifyMultiple(blsSignature, blsPublicKeys, messages), "BLS: validateSignatures failed");
+ }
+
+ /**
+ * get a hash of userOp
+ * NOTE: this hash is not the same as UserOperation.hash()
+ * (slightly less efficient, since it uses memory userOp)
+ */
+ function internalUserOpHash(PackedUserOperation memory userOp) internal pure returns (bytes32) {
+ return keccak256(abi.encode(
+ userOp.sender,
+ userOp.nonce,
+ keccak256(userOp.initCode),
+ keccak256(userOp.callData),
+ userOp.accountGasLimits,
+ userOp.preVerificationGas,
+ userOp.gasFees,
+ keccak256(userOp.paymasterAndData)
+ ));
+ }
+
+ /**
+ * return the BLS "message" for the given UserOp.
+ * the account checks the signature over this value using its public key
+ */
+ function userOpToMessage(PackedUserOperation memory userOp) public view returns (uint256[2] memory) {
+ bytes32 publicKeyHash = _getPublicKeyHash(getUserOpPublicKey(userOp));
+ return _userOpToMessage(userOp, publicKeyHash);
+ }
+
+ function _userOpToMessage(PackedUserOperation memory userOp, bytes32 publicKeyHash) internal view returns (uint256[2] memory) {
+ bytes32 userOpHash = _getUserOpHash(userOp, publicKeyHash);
+ return BLSOpen.hashToPoint(BLS_DOMAIN, abi.encodePacked(userOpHash));
+ }
+
+
+ function getUserOpHash(PackedUserOperation memory userOp) public view returns (bytes32) {
+ bytes32 publicKeyHash = _getPublicKeyHash(getUserOpPublicKey(userOp));
+ return _getUserOpHash(userOp, publicKeyHash);
+ }
+
+ function _getUserOpHash(PackedUserOperation memory userOp, bytes32 publicKeyHash) internal view returns (bytes32) {
+ return keccak256(abi.encode(internalUserOpHash(userOp), publicKeyHash, address(this), block.chainid, entryPoint));
+ }
+
+ function _getPublicKeyHash(uint256[4] memory publicKey) internal pure returns(bytes32) {
+ return keccak256(abi.encode(publicKey));
+ }
+ /**
+ * validate signature of a single userOp
+ * This method is called after EntryPoint.simulateValidation() returns an aggregator.
+ * First it validates the signature over the userOp. then it return data to be used when creating the handleOps:
+ * @param userOp the userOperation received from the user.
+ * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.
+ * (usually empty, unless account and aggregator support some kind of "multisig"
+ */
+ function validateUserOpSignature(PackedUserOperation calldata userOp)
+ external view returns (bytes memory sigForUserOp) {
+ uint256[2] memory signature = abi.decode(userOp.signature, (uint256[2]));
+ uint256[4] memory pubkey = getUserOpPublicKey(userOp);
+ uint256[2] memory message = _userOpToMessage(userOp, _getPublicKeyHash(pubkey));
+
+ require(BLSOpen.verifySingle(signature, pubkey, message), "BLS: wrong sig");
+ return "";
+ }
+
+
+ /**
+ * aggregate multiple signatures into a single value.
+ * This method is called off-chain to calculate the signature to pass with handleOps()
+ * bundler MAY use optimized custom code perform this aggregation
+ * @param userOps array of UserOperations to collect the signatures from.
+ * @return aggregatedSignature the aggregated signature
+ */
+ function aggregateSignatures(PackedUserOperation[] calldata userOps) external pure returns (bytes memory aggregatedSignature) {
+ BLSHelper.XY[] memory points = new BLSHelper.XY[](userOps.length);
+ for (uint256 i = 0; i < points.length; i++) {
+ (uint256 x, uint256 y) = abi.decode(userOps[i].signature, (uint256, uint256));
+ points[i] = BLSHelper.XY(x, y);
+ }
+ BLSHelper.XY memory sum = BLSHelper.sum(points, N);
+ return abi.encode(sum.x, sum.y);
+ }
+
+ /**
+ * allow staking for this aggregator
+ * there is no limit on stake or delay, but it is not a problem, since it is a permissionless
+ * signature aggregator, which doesn't support unstaking.
+ * @param unstakeDelaySec - the required unstaked delay
+ */
+ function addStake(uint32 unstakeDelaySec) external payable {
+ IEntryPoint(entryPoint).addStake{value : msg.value}(unstakeDelaySec);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/IBLSAccount.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/IBLSAccount.sol
new file mode 100644
index 000000000..c7d0e7f6c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/IBLSAccount.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-3.0-only
+pragma solidity >=0.7.5;
+
+import "../../interfaces/IAccount.sol";
+
+/**
+ * a BLS account should expose its own public key.
+ */
+interface IBLSAccount is IAccount {
+ event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);
+
+ /**
+ * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.
+ */
+ function getBlsPublicKey() external view returns (uint256[4] memory);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/BLSOpen.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/BLSOpen.sol
new file mode 100644
index 000000000..914955b3d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/BLSOpen.sol
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.23;
+
+import { BLS } from "./hubble-contracts/contracts/libs/BLS.sol";
+
+library BLSOpen {
+ function verifySingle(
+ uint256[2] memory signature,
+ uint256[4] memory pubkey,
+ uint256[2] memory message
+ ) external view returns (bool) {
+ uint256[4][] memory pubkeys = new uint256[4][](1);
+ uint256[2][] memory messages = new uint256[2][](1);
+ pubkeys[0] = pubkey;
+ messages[0] = message;
+
+ (bool verified, bool callSuccess) = BLS.verifyMultiple(
+ signature,
+ pubkeys,
+ messages
+ );
+ return callSuccess && verified;
+
+ // // NB: (result, success) opposite of `call` convention (success, result).
+ // (bool verified, bool callSuccess) = BLS.verifySingle(
+ // signature,
+ // pubkey,
+ // message
+ // );
+ // return callSuccess && verified;
+ }
+
+ function verifyMultiple(
+ uint256[2] memory signature,
+ uint256[4][] memory pubkeys,
+ uint256[2][] memory messages
+ ) external view returns (bool) {
+ (bool verified, bool callSuccess) = BLS.verifyMultiple(
+ signature,
+ pubkeys,
+ messages
+ );
+ return callSuccess && verified;
+ }
+
+ function hashToPoint(
+ bytes32 domain,
+ bytes memory message
+ ) external view returns (uint256[2] memory) {
+ return BLS.hashToPoint(
+ domain,
+ message
+ );
+ }
+
+ function isZeroBLSKey(uint256[4] memory blsKey) public pure returns (bool) {
+ bool isZero = true;
+ for (uint256 i=0; isZero && i<4; i++) {
+ isZero = (blsKey[i] == 0);
+ }
+ return isZero;
+ }
+
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol
new file mode 100644
index 000000000..e02bc10c3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol
@@ -0,0 +1,440 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >= 0.6.12;
+
+import { ModexpInverse, ModexpSqrt } from "./ModExp.sol";
+import {
+ BNPairingPrecompileCostEstimator
+} from "./BNPairingPrecompileCostEstimator.sol";
+
+/**
+ @title Boneh–Lynn–Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)
+ @notice We use BLS signature aggregation to reduce the size of signature data to store on chain.
+ @dev We use G1 points for signatures and messages, and G2 points for public keys
+ */
+library BLS {
+ // Field order
+ // prettier-ignore
+ uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
+
+ // Negated genarator of G2
+ // prettier-ignore
+ uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
+ // prettier-ignore
+ uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
+ // prettier-ignore
+ uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;
+ // prettier-ignore
+ uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;
+
+ // sqrt(-3)
+ // prettier-ignore
+ uint256 private constant Z0 = 0x0000000000000000b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd;
+ // (sqrt(-3) - 1) / 2
+ // prettier-ignore
+ uint256 private constant Z1 = 0x000000000000000059e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe;
+
+ // prettier-ignore
+ uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000;
+ // prettier-ignore
+ uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff;
+
+ // estimator address
+// address private constant COST_ESTIMATOR_ADDRESS = new 0x22E4a5251C1F02de8369Dd6f192033F6CB7531A4;
+
+ function verifySingle(
+ uint256[2] memory signature,
+ uint256[4] memory pubkey,
+ uint256[2] memory message
+ ) internal view returns (bool, bool) {
+ uint256[12] memory input =
+ [
+ signature[0],
+ signature[1],
+ N_G2_X1,
+ N_G2_X0,
+ N_G2_Y1,
+ N_G2_Y0,
+ message[0],
+ message[1],
+ pubkey[1],
+ pubkey[0],
+ pubkey[3],
+ pubkey[2]
+ ];
+ uint256[1] memory out;
+ uint256 precompileGasCost = gasleft();
+// BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(
+// 2
+// );
+ bool callSuccess;
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ callSuccess := staticcall(
+ precompileGasCost,
+ 8,
+ input,
+ 384,
+ out,
+ 0x20
+ )
+ }
+ if (!callSuccess) {
+ return (false, false);
+ }
+ return (out[0] != 0, true);
+ }
+
+ function verifyMultiple(
+ uint256[2] memory signature,
+ uint256[4][] memory pubkeys,
+ uint256[2][] memory messages
+ ) internal view returns (bool checkResult, bool callSuccess) {
+ uint256 size = pubkeys.length;
+ require(size > 0, "BLS: number of public key is zero");
+ require(
+ size == messages.length,
+ "BLS: number of public keys and messages must be equal"
+ );
+ uint256 inputSize = (size + 1) * 6;
+ uint256[] memory input = new uint256[](inputSize);
+ input[0] = signature[0];
+ input[1] = signature[1];
+ input[2] = N_G2_X1;
+ input[3] = N_G2_X0;
+ input[4] = N_G2_Y1;
+ input[5] = N_G2_Y0;
+ for (uint256 i = 0; i < size; i++) {
+ input[i * 6 + 6] = messages[i][0];
+ input[i * 6 + 7] = messages[i][1];
+ input[i * 6 + 8] = pubkeys[i][1];
+ input[i * 6 + 9] = pubkeys[i][0];
+ input[i * 6 + 10] = pubkeys[i][3];
+ input[i * 6 + 11] = pubkeys[i][2];
+ }
+ uint256[1] memory out;
+
+ // prettier-ignore
+ uint256 precompileGasCost = gasleft();
+// uint256 precompileGasCost = BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(size + 1);
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ callSuccess := staticcall(
+ precompileGasCost,
+ 8,
+ add(input, 0x20),
+ mul(inputSize, 0x20),
+ out,
+ 0x20
+ )
+ }
+ if (!callSuccess) {
+ return (false, false);
+ }
+ return (out[0] != 0, true);
+ }
+
+ /**
+ @notice Fouque-Tibouchi Hash to Curve
+ */
+ function hashToPoint(bytes32 domain, bytes memory message)
+ internal
+ view
+ returns (uint256[2] memory)
+ {
+ uint256[2] memory u = hashToField(domain, message);
+ uint256[2] memory p0 = mapToPoint(u[0]);
+ uint256[2] memory p1 = mapToPoint(u[1]);
+ uint256[4] memory bnAddInput;
+ bnAddInput[0] = p0[0];
+ bnAddInput[1] = p0[1];
+ bnAddInput[2] = p1[0];
+ bnAddInput[3] = p1[1];
+ bool success;
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ success := staticcall(sub(gas(), 2000), 6, bnAddInput, 128, p0, 64)
+ switch success
+ case 0 {
+ invalid()
+ }
+ }
+ require(success, "BLS: bn add call failed");
+ return p0;
+ }
+
+ function mapToPoint(uint256 _x)
+ internal
+ pure
+ returns (uint256[2] memory p)
+ {
+ require(_x < N, "mapToPointFT: invalid field element");
+ uint256 x = _x;
+
+ (, bool decision) = sqrt(x);
+
+ uint256 a0 = mulmod(x, x, N);
+ a0 = addmod(a0, 4, N);
+ uint256 a1 = mulmod(x, Z0, N);
+ uint256 a2 = mulmod(a1, a0, N);
+ a2 = inverse(a2);
+ a1 = mulmod(a1, a1, N);
+ a1 = mulmod(a1, a2, N);
+
+ // x1
+ a1 = mulmod(x, a1, N);
+ x = addmod(Z1, N - a1, N);
+ // check curve
+ a1 = mulmod(x, x, N);
+ a1 = mulmod(a1, x, N);
+ a1 = addmod(a1, 3, N);
+ bool found;
+ (a1, found) = sqrt(a1);
+ if (found) {
+ if (!decision) {
+ a1 = N - a1;
+ }
+ return [x, a1];
+ }
+
+ // x2
+ x = N - addmod(x, 1, N);
+ // check curve
+ a1 = mulmod(x, x, N);
+ a1 = mulmod(a1, x, N);
+ a1 = addmod(a1, 3, N);
+ (a1, found) = sqrt(a1);
+ if (found) {
+ if (!decision) {
+ a1 = N - a1;
+ }
+ return [x, a1];
+ }
+
+ // x3
+ x = mulmod(a0, a0, N);
+ x = mulmod(x, x, N);
+ x = mulmod(x, a2, N);
+ x = mulmod(x, a2, N);
+ x = addmod(x, 1, N);
+ // must be on curve
+ a1 = mulmod(x, x, N);
+ a1 = mulmod(a1, x, N);
+ a1 = addmod(a1, 3, N);
+ (a1, found) = sqrt(a1);
+ require(found, "BLS: bad ft mapping implementation");
+ if (!decision) {
+ a1 = N - a1;
+ }
+ return [x, a1];
+ }
+
+ function isValidSignature(uint256[2] memory signature)
+ internal
+ pure
+ returns (bool)
+ {
+ if ((signature[0] >= N) || (signature[1] >= N)) {
+ return false;
+ } else {
+ return isOnCurveG1(signature);
+ }
+ }
+
+ function isOnCurveG1(uint256[2] memory point)
+ internal
+ pure
+ returns (bool _isOnCurve)
+ {
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ let t0 := mload(point)
+ let t1 := mload(add(point, 32))
+ let t2 := mulmod(t0, t0, N)
+ t2 := mulmod(t2, t0, N)
+ t2 := addmod(t2, 3, N)
+ t1 := mulmod(t1, t1, N)
+ _isOnCurve := eq(t1, t2)
+ }
+ }
+
+ function isOnCurveG2(uint256[4] memory point)
+ internal
+ pure
+ returns (bool _isOnCurve)
+ {
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ // x0, x1
+ let t0 := mload(point)
+ let t1 := mload(add(point, 32))
+ // x0 ^ 2
+ let t2 := mulmod(t0, t0, N)
+ // x1 ^ 2
+ let t3 := mulmod(t1, t1, N)
+ // 3 * x0 ^ 2
+ let t4 := add(add(t2, t2), t2)
+ // 3 * x1 ^ 2
+ let t5 := addmod(add(t3, t3), t3, N)
+ // x0 * (x0 ^ 2 - 3 * x1 ^ 2)
+ t2 := mulmod(add(t2, sub(N, t5)), t0, N)
+ // x1 * (3 * x0 ^ 2 - x1 ^ 2)
+ t3 := mulmod(add(t4, sub(N, t3)), t1, N)
+
+ // x ^ 3 + b
+ t0 := addmod(
+ t2,
+ 0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5,
+ N
+ )
+ t1 := addmod(
+ t3,
+ 0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2,
+ N
+ )
+
+ // y0, y1
+ t2 := mload(add(point, 64))
+ t3 := mload(add(point, 96))
+ // y ^ 2
+ t4 := mulmod(addmod(t2, t3, N), addmod(t2, sub(N, t3), N), N)
+ t3 := mulmod(shl(1, t2), t3, N)
+
+ // y ^ 2 == x ^ 3 + b
+ _isOnCurve := and(eq(t0, t4), eq(t1, t3))
+ }
+ }
+
+ function sqrt(uint256 xx) internal pure returns (uint256 x, bool hasRoot) {
+ x = ModexpSqrt.run(xx);
+ hasRoot = mulmod(x, x, N) == xx;
+ }
+
+ function inverse(uint256 a) internal pure returns (uint256) {
+ return ModexpInverse.run(a);
+ }
+
+ function hashToField(bytes32 domain, bytes memory messages)
+ internal
+ pure
+ returns (uint256[2] memory)
+ {
+ bytes memory _msg = expandMsgTo96(domain, messages);
+ uint256 u0;
+ uint256 u1;
+ uint256 a0;
+ uint256 a1;
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ let p := add(_msg, 24)
+ u1 := and(mload(p), MASK24)
+ p := add(_msg, 48)
+ u0 := and(mload(p), MASK24)
+ a0 := addmod(mulmod(u1, T24, N), u0, N)
+ p := add(_msg, 72)
+ u1 := and(mload(p), MASK24)
+ p := add(_msg, 96)
+ u0 := and(mload(p), MASK24)
+ a1 := addmod(mulmod(u1, T24, N), u0, N)
+ }
+ return [a0, a1];
+ }
+
+ function expandMsgTo96(bytes32 domain, bytes memory message)
+ internal
+ pure
+ returns (bytes memory)
+ {
+ // zero<64>|msg|lib_str<2>|I2OSP(0, 1)<1>|dst|dst_len<1>
+ uint256 t0 = message.length;
+ bytes memory msg0 = new bytes(32 + t0 + 64 + 4);
+ bytes memory out = new bytes(96);
+ // b0
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ let p := add(msg0, 96)
+ for {
+ let z := 0
+ } lt(z, t0) {
+ z := add(z, 32)
+ } {
+ mstore(add(p, z), mload(add(message, add(z, 32))))
+ }
+ p := add(p, t0)
+
+ mstore8(p, 0)
+ p := add(p, 1)
+ mstore8(p, 96)
+ p := add(p, 1)
+ mstore8(p, 0)
+ p := add(p, 1)
+
+ mstore(p, domain)
+ p := add(p, 32)
+ mstore8(p, 32)
+ }
+ bytes32 b0 = sha256(msg0);
+ bytes32 bi;
+ t0 = 32 + 34;
+
+ // resize intermediate message
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ mstore(msg0, t0)
+ }
+
+ // b1
+
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ mstore(add(msg0, 32), b0)
+ mstore8(add(msg0, 64), 1)
+ mstore(add(msg0, 65), domain)
+ mstore8(add(msg0, add(32, 65)), 32)
+ }
+
+ bi = sha256(msg0);
+
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ mstore(add(out, 32), bi)
+ }
+
+ // b2
+
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ let t := xor(b0, bi)
+ mstore(add(msg0, 32), t)
+ mstore8(add(msg0, 64), 2)
+ mstore(add(msg0, 65), domain)
+ mstore8(add(msg0, add(32, 65)), 32)
+ }
+
+ bi = sha256(msg0);
+
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ mstore(add(out, 64), bi)
+ }
+
+ // b3
+
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ let t := xor(b0, bi)
+ mstore(add(msg0, 32), t)
+ mstore8(add(msg0, 64), 3)
+ mstore(add(msg0, 65), domain)
+ mstore8(add(msg0, add(32, 65)), 32)
+ }
+
+ bi = sha256(msg0);
+
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ mstore(add(out, 96), bi)
+ }
+
+ return out;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol
new file mode 100644
index 000000000..6fd08f118
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol
@@ -0,0 +1,652 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >= 0.6.12;
+
+/**
+ @title Compute Inverse by Modular Exponentiation
+ @notice Compute $input^(N - 2) mod N$ using Addition Chain method.
+ Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47
+ and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45
+ @dev the function body is generated with the modified addchain script
+ see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f
+ */
+library ModexpInverse {
+ function run(uint256 t2) internal pure returns (uint256 t0) {
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ let
+ n
+ := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47
+ t0 := mulmod(t2, t2, n)
+ let t5 := mulmod(t0, t2, n)
+ let t1 := mulmod(t5, t0, n)
+ let t3 := mulmod(t5, t5, n)
+ let t8 := mulmod(t1, t0, n)
+ let t4 := mulmod(t3, t5, n)
+ let t6 := mulmod(t3, t1, n)
+ t0 := mulmod(t3, t3, n)
+ let t7 := mulmod(t8, t3, n)
+ t3 := mulmod(t4, t3, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t7, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t7, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t7, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t3, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t3, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t3, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ }
+ }
+}
+
+/**
+ @title Compute Squre Root by Modular Exponentiation
+ @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.
+ Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47
+ and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52
+ */
+library ModexpSqrt {
+ function run(uint256 t6) internal pure returns (uint256 t0) {
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ let
+ n
+ := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47
+
+ t0 := mulmod(t6, t6, n)
+ let t4 := mulmod(t0, t6, n)
+ let t2 := mulmod(t4, t0, n)
+ let t3 := mulmod(t4, t4, n)
+ let t8 := mulmod(t2, t0, n)
+ let t1 := mulmod(t3, t4, n)
+ let t5 := mulmod(t3, t2, n)
+ t0 := mulmod(t3, t3, n)
+ let t7 := mulmod(t8, t3, n)
+ t3 := mulmod(t1, t3, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t7, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t7, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t8, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t7, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t3, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t6, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t5, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t4, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t3, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t3, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t2, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t0, n)
+ t0 := mulmod(t0, t1, n)
+ t0 := mulmod(t0, t0, n)
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/callback/TokenCallbackHandler.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/callback/TokenCallbackHandler.sol
new file mode 100644
index 000000000..2b4a72ffc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/callback/TokenCallbackHandler.sol
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable no-empty-blocks */
+
+import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
+import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
+
+/**
+ * Token callback handler.
+ * Handles supported tokens' callbacks, allowing account receiving these tokens.
+ */
+abstract contract TokenCallbackHandler is IERC721Receiver, IERC1155Receiver {
+
+ function onERC721Received(
+ address,
+ address,
+ uint256,
+ bytes calldata
+ ) external pure override returns (bytes4) {
+ return IERC721Receiver.onERC721Received.selector;
+ }
+
+ function onERC1155Received(
+ address,
+ address,
+ uint256,
+ uint256,
+ bytes calldata
+ ) external pure override returns (bytes4) {
+ return IERC1155Receiver.onERC1155Received.selector;
+ }
+
+ function onERC1155BatchReceived(
+ address,
+ address,
+ uint256[] calldata,
+ uint256[] calldata,
+ bytes calldata
+ ) external pure override returns (bytes4) {
+ return IERC1155Receiver.onERC1155BatchReceived.selector;
+ }
+
+ function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {
+ return
+ interfaceId == type(IERC721Receiver).interfaceId ||
+ interfaceId == type(IERC1155Receiver).interfaceId ||
+ interfaceId == type(IERC165).interfaceId;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/IOracle.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/IOracle.sol
new file mode 100644
index 000000000..a8c238126
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/IOracle.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.23;
+
+interface IOracle {
+ function decimals() external view returns (uint8);
+ function latestRoundData()
+ external
+ view
+ returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/OracleHelper.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/OracleHelper.sol
new file mode 100644
index 000000000..49e6fcf5c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/OracleHelper.sol
@@ -0,0 +1,170 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable not-rely-on-time */
+
+import "./IOracle.sol";
+
+/// @title Helper functions for dealing with various forms of price feed oracles.
+/// @notice Maintains a price cache and updates the current price if needed.
+/// In the best case scenario we have a direct oracle from the token to the native asset.
+/// Also support tokens that have no direct price oracle to the native asset.
+/// Sometimes oracles provide the price in the opposite direction of what we need in the moment.
+abstract contract OracleHelper {
+
+ event TokenPriceUpdated(uint256 currentPrice, uint256 previousPrice, uint256 cachedPriceTimestamp);
+
+ uint256 private constant PRICE_DENOMINATOR = 1e26;
+
+ struct OracleHelperConfig {
+
+ /// @notice The price cache will be returned without even fetching the oracles for this number of seconds
+ uint48 cacheTimeToLive;
+
+ /// @notice The maximum acceptable age of the price oracle round
+ uint48 maxOracleRoundAge;
+
+ /// @notice The Oracle contract used to fetch the latest token prices
+ IOracle tokenOracle;
+
+ /// @notice The Oracle contract used to fetch the latest native asset prices. Only needed if tokenToNativeOracle flag is not set.
+ IOracle nativeOracle;
+
+ /// @notice If 'true' we will fetch price directly from tokenOracle
+ /// @notice If 'false' we will use nativeOracle to establish a token price through a shared third currency
+ bool tokenToNativeOracle;
+
+ /// @notice 'false' if price is bridging-asset-per-token (or native-asset-per-token), 'true' if price is tokens-per-bridging-asset
+ bool tokenOracleReverse;
+
+ /// @notice 'false' if price is bridging-asset-per-native-asset, 'true' if price is native-asset-per-bridging-asset
+ bool nativeOracleReverse;
+
+ /// @notice The price update threshold percentage from PRICE_DENOMINATOR that triggers a price update (1e26 = 100%)
+ uint256 priceUpdateThreshold;
+
+ }
+
+ /// @notice The cached token price from the Oracle, always in (native-asset-per-token) * PRICE_DENOMINATOR format
+ uint256 public cachedPrice;
+
+ /// @notice The timestamp of a block when the cached price was updated
+ uint48 public cachedPriceTimestamp;
+
+ OracleHelperConfig private oracleHelperConfig;
+
+ /// @notice The "10^(tokenOracle.decimals)" value used for the price calculation
+ uint128 private tokenOracleDecimalPower;
+
+ /// @notice The "10^(nativeOracle.decimals)" value used for the price calculation
+ uint128 private nativeOracleDecimalPower;
+
+ constructor (
+ OracleHelperConfig memory _oracleHelperConfig
+ ) {
+ cachedPrice = type(uint256).max; // initialize the storage slot to invalid value
+ _setOracleConfiguration(
+ _oracleHelperConfig
+ );
+ }
+
+ function _setOracleConfiguration(
+ OracleHelperConfig memory _oracleHelperConfig
+ ) private {
+ oracleHelperConfig = _oracleHelperConfig;
+ require(_oracleHelperConfig.priceUpdateThreshold <= PRICE_DENOMINATOR, "TPM: update threshold too high");
+ tokenOracleDecimalPower = uint128(10 ** oracleHelperConfig.tokenOracle.decimals());
+ if (oracleHelperConfig.tokenToNativeOracle) {
+ require(address(oracleHelperConfig.nativeOracle) == address(0), "TPM: native oracle must be zero");
+ nativeOracleDecimalPower = 1;
+ } else {
+ nativeOracleDecimalPower = uint128(10 ** oracleHelperConfig.nativeOracle.decimals());
+ }
+ }
+
+ /// @notice Updates the token price by fetching the latest price from the Oracle.
+ /// @param force true to force cache update, even if called after short time or the change is lower than the update threshold.
+ /// @return newPrice the new cached token price
+ function updateCachedPrice(bool force) public returns (uint256) {
+ uint256 cacheTimeToLive = oracleHelperConfig.cacheTimeToLive;
+ uint256 cacheAge = block.timestamp - cachedPriceTimestamp;
+ if (!force && cacheAge <= cacheTimeToLive) {
+ return cachedPrice;
+ }
+ uint256 priceUpdateThreshold = oracleHelperConfig.priceUpdateThreshold;
+ IOracle tokenOracle = oracleHelperConfig.tokenOracle;
+ IOracle nativeOracle = oracleHelperConfig.nativeOracle;
+
+ uint256 _cachedPrice = cachedPrice;
+ uint256 tokenPrice = fetchPrice(tokenOracle);
+ uint256 nativeAssetPrice = 1;
+ // If the 'TokenOracle' returns the price in the native asset units there is no need to fetch native asset price
+ if (!oracleHelperConfig.tokenToNativeOracle) {
+ nativeAssetPrice = fetchPrice(nativeOracle);
+ }
+ uint256 newPrice = calculatePrice(
+ tokenPrice,
+ nativeAssetPrice,
+ oracleHelperConfig.tokenOracleReverse,
+ oracleHelperConfig.nativeOracleReverse
+ );
+ uint256 priceRatio = PRICE_DENOMINATOR * newPrice / _cachedPrice;
+ bool updateRequired = force ||
+ priceRatio > PRICE_DENOMINATOR + priceUpdateThreshold ||
+ priceRatio < PRICE_DENOMINATOR - priceUpdateThreshold;
+ if (!updateRequired) {
+ return _cachedPrice;
+ }
+ cachedPrice = newPrice;
+ cachedPriceTimestamp = uint48(block.timestamp);
+ emit TokenPriceUpdated(newPrice, _cachedPrice, cachedPriceTimestamp);
+ return newPrice;
+ }
+
+ /**
+ * Calculate the effective price of the selected token denominated in native asset.
+ *
+ * @param tokenPrice - the price of the token relative to a native asset or a bridging asset like the U.S. dollar.
+ * @param nativeAssetPrice - the price of the native asset relative to a bridging asset or 1 if no bridging needed.
+ * @param tokenOracleReverse - flag indicating direction of the "tokenPrice".
+ * @param nativeOracleReverse - flag indicating direction of the "nativeAssetPrice".
+ * @return the native-asset-per-token price multiplied by the PRICE_DENOMINATOR constant.
+ */
+ function calculatePrice(
+ uint256 tokenPrice,
+ uint256 nativeAssetPrice,
+ bool tokenOracleReverse,
+ bool nativeOracleReverse
+ ) private view returns (uint256){
+ // tokenPrice is normalized as bridging-asset-per-token
+ if (tokenOracleReverse) {
+ // inverting tokenPrice that was tokens-per-bridging-asset (or tokens-per-native-asset)
+ tokenPrice = PRICE_DENOMINATOR * tokenOracleDecimalPower / tokenPrice;
+ } else {
+ // tokenPrice already bridging-asset-per-token (or native-asset-per-token)
+ tokenPrice = PRICE_DENOMINATOR * tokenPrice / tokenOracleDecimalPower;
+ }
+
+ if (nativeOracleReverse) {
+ // multiplying by nativeAssetPrice that is native-asset-per-bridging-asset
+ // => result = (bridging-asset / token) * (native-asset / bridging-asset) = native-asset / token
+ return nativeAssetPrice * tokenPrice / nativeOracleDecimalPower;
+ } else {
+ // dividing by nativeAssetPrice that is bridging-asset-per-native-asset
+ // => result = (bridging-asset / token) / (bridging-asset / native-asset) = native-asset / token
+ return tokenPrice * nativeOracleDecimalPower / nativeAssetPrice;
+ }
+ }
+
+ /// @notice Fetches the latest price from the given Oracle.
+ /// @dev This function is used to get the latest price from the tokenOracle or nativeOracle.
+ /// @param _oracle The Oracle contract to fetch the price from.
+ /// @return price The latest price fetched from the Oracle.
+ function fetchPrice(IOracle _oracle) internal view returns (uint256 price) {
+ (uint80 roundId, int256 answer,, uint256 updatedAt, uint80 answeredInRound) = _oracle.latestRoundData();
+ require(answer > 0, "TPM: Chainlink price <= 0");
+ require(updatedAt >= block.timestamp - oracleHelperConfig.maxOracleRoundAge, "TPM: Incomplete round");
+ require(answeredInRound >= roundId, "TPM: Stale price");
+ price = uint256(answer);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/UniswapHelper.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/UniswapHelper.sol
new file mode 100644
index 000000000..a670ced8d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/UniswapHelper.sol
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.23;
+
+/* solhint-disable not-rely-on-time */
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
+import "@uniswap/v3-periphery/contracts/interfaces/IPeripheryPayments.sol";
+
+abstract contract UniswapHelper {
+ event UniswapReverted(address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin);
+
+ uint256 private constant PRICE_DENOMINATOR = 1e26;
+
+ struct UniswapHelperConfig {
+ /// @notice Minimum native asset amount to receive from a single swap
+ uint256 minSwapAmount;
+
+ uint24 uniswapPoolFee;
+
+ uint8 slippage;
+ }
+
+ /// @notice The Uniswap V3 SwapRouter contract
+ ISwapRouter public immutable uniswap;
+
+ /// @notice The ERC20 token used for transaction fee payments
+ IERC20 public immutable token;
+
+ /// @notice The ERC-20 token that wraps the native asset for current chain
+ IERC20 public immutable wrappedNative;
+
+ UniswapHelperConfig private uniswapHelperConfig;
+
+ constructor(
+ IERC20 _token,
+ IERC20 _wrappedNative,
+ ISwapRouter _uniswap,
+ UniswapHelperConfig memory _uniswapHelperConfig
+ ){
+ _token.approve(address(_uniswap), type(uint256).max);
+ token = _token;
+ wrappedNative = _wrappedNative;
+ uniswap = _uniswap;
+ _setUniswapHelperConfiguration(_uniswapHelperConfig);
+ }
+
+ function _setUniswapHelperConfiguration(UniswapHelperConfig memory _uniswapHelperConfig) internal {
+ uniswapHelperConfig = _uniswapHelperConfig;
+ }
+
+ function _maybeSwapTokenToWeth(IERC20 tokenIn, uint256 quote) internal returns (uint256) {
+ uint256 tokenBalance = tokenIn.balanceOf(address(this));
+ uint256 amountOutMin = addSlippage(tokenToWei(tokenBalance, quote), uniswapHelperConfig.slippage);
+ if (amountOutMin < uniswapHelperConfig.minSwapAmount) {
+ return 0;
+ }
+ // note: calling 'swapToToken' but destination token is Wrapped Ether
+ return swapToToken(
+ address(tokenIn),
+ address(wrappedNative),
+ tokenBalance,
+ amountOutMin,
+ uniswapHelperConfig.uniswapPoolFee
+ );
+ }
+
+ function addSlippage(uint256 amount, uint8 slippage) private pure returns (uint256) {
+ return amount * (1000 - slippage) / 1000;
+ }
+
+
+ function tokenToWei(uint256 amount, uint256 price) public pure returns (uint256) {
+ return amount * price / PRICE_DENOMINATOR;
+ }
+
+ function weiToToken(uint256 amount, uint256 price) public pure returns (uint256) {
+ return amount * PRICE_DENOMINATOR / price;
+ }
+
+ function unwrapWeth(uint256 amount) internal {
+ IPeripheryPayments(address(uniswap)).unwrapWETH9(amount, address(this));
+ }
+
+ // swap ERC-20 tokens at market price
+ function swapToToken(
+ address tokenIn,
+ address tokenOut,
+ uint256 amountIn,
+ uint256 amountOutMin,
+ uint24 fee
+ ) internal returns (uint256 amountOut) {
+ ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams(
+ tokenIn, //tokenIn
+ tokenOut, //tokenOut
+ fee,
+ address(uniswap),
+ block.timestamp, //deadline
+ amountIn,
+ amountOutMin,
+ 0
+ );
+ try uniswap.exactInputSingle(params) returns (uint256 _amountOut) {
+ amountOut = _amountOut;
+ } catch {
+ emit UniswapReverted(tokenIn, tokenOut, amountIn, amountOutMin);
+ amountOut = 0;
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/utils/Exec.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/utils/Exec.sol
new file mode 100644
index 000000000..ee8d71ac0
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/utils/Exec.sol
@@ -0,0 +1,70 @@
+// SPDX-License-Identifier: LGPL-3.0-only
+pragma solidity ^0.8.23;
+
+// solhint-disable no-inline-assembly
+
+/**
+ * Utility functions helpful when making different kinds of contract calls in Solidity.
+ */
+library Exec {
+
+ function call(
+ address to,
+ uint256 value,
+ bytes memory data,
+ uint256 txGas
+ ) internal returns (bool success) {
+ assembly ("memory-safe") {
+ success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)
+ }
+ }
+
+ function staticcall(
+ address to,
+ bytes memory data,
+ uint256 txGas
+ ) internal view returns (bool success) {
+ assembly ("memory-safe") {
+ success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)
+ }
+ }
+
+ function delegateCall(
+ address to,
+ bytes memory data,
+ uint256 txGas
+ ) internal returns (bool success) {
+ assembly ("memory-safe") {
+ success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)
+ }
+ }
+
+ // get returned data from last call or calldelegate
+ function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {
+ assembly ("memory-safe") {
+ let len := returndatasize()
+ if gt(len, maxLen) {
+ len := maxLen
+ }
+ let ptr := mload(0x40)
+ mstore(0x40, add(ptr, add(len, 0x20)))
+ mstore(ptr, len)
+ returndatacopy(add(ptr, 0x20), 0, len)
+ returnData := ptr
+ }
+ }
+
+ // revert with explicit byte array (probably reverted info from call)
+ function revertWithData(bytes memory returnData) internal pure {
+ assembly ("memory-safe") {
+ revert(add(returnData, 32), mload(returnData))
+ }
+ }
+
+ function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {
+ bool success = call(to,0,data,gasleft());
+ if (!success) {
+ revertWithData(getReturnData(maxLen));
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deploy/1_deploy_entrypoint.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deploy/1_deploy_entrypoint.ts
new file mode 100644
index 000000000..fbfdb836b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deploy/1_deploy_entrypoint.ts
@@ -0,0 +1,19 @@
+import { HardhatRuntimeEnvironment } from 'hardhat/types'
+import { DeployFunction } from 'hardhat-deploy/types'
+import { ethers } from 'hardhat'
+
+const deployEntryPoint: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
+ const provider = ethers.provider
+ const from = await provider.getSigner().getAddress()
+
+ const ret = await hre.deployments.deploy('EntryPoint', {
+ from,
+ args: [],
+ gasLimit: 6e6,
+ deterministicDeployment: process.env.SALT ?? true,
+ log: true,
+ })
+ console.log('==entrypoint addr=', ret.address)
+}
+
+export default deployEntryPoint
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deploy/2_deploy_SimpleAccountFactory.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deploy/2_deploy_SimpleAccountFactory.ts
new file mode 100644
index 000000000..88d742915
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deploy/2_deploy_SimpleAccountFactory.ts
@@ -0,0 +1,33 @@
+import { HardhatRuntimeEnvironment } from 'hardhat/types'
+import { DeployFunction } from 'hardhat-deploy/types'
+import { ethers } from 'hardhat'
+
+const deploySimpleAccountFactory: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
+ const provider = ethers.provider
+ const from = await provider.getSigner().getAddress()
+ const network = await provider.getNetwork()
+ // only deploy on local test network.
+
+ const forceDeployFactory = process.argv.join(' ').match(/simple-account-factory/) != null
+
+ if (!forceDeployFactory && network.chainId !== 31337 && network.chainId !== 1337) {
+ return
+ }
+
+ const entrypoint = await hre.deployments.get('EntryPoint')
+ await hre.deployments.deploy('SimpleAccountFactory', {
+ from,
+ args: [entrypoint.address],
+ gasLimit: 6e6,
+ log: true,
+ deterministicDeployment: true,
+ })
+
+ await hre.deployments.deploy('TestCounter', {
+ from,
+ deterministicDeployment: true,
+ log: true,
+ })
+}
+
+export default deploySimpleAccountFactory
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/.chainId
new file mode 100644
index 000000000..7df83ecbe
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/.chainId
@@ -0,0 +1 @@
+42161
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/EntryPoint.json
new file mode 100644
index 000000000..916c23908
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/EntryPoint.json
@@ -0,0 +1,1318 @@
+{
+ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "paid",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bool",
+ "name": "targetSuccess",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetResult",
+ "type": "bytes"
+ }
+ ],
+ "name": "ExecutionResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SenderAddressResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureValidationFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct IEntryPoint.AggregatorStakeInfo",
+ "name": "aggregatorInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResultWithAggregation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "factory",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "AccountDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "BeforeExecution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalDeposit",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposited",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureAggregatorChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStaked",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeLocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasUsed",
+ "type": "uint256"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawn",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "SIG_VALIDATION_FAILED",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ }
+ ],
+ "name": "_validateSenderAndPaymaster",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "depositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "deposits",
+ "outputs": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getDepositInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "internalType": "struct IStakeManager.DepositInfo",
+ "name": "info",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "getUserOpHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "userOps",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "contract IAggregator",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.UserOpsPerAggregator[]",
+ "name": "opsPerAggregator",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleAggregatedOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "incrementNonce",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.MemoryUserOp",
+ "name": "mUserOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "contextOffset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.UserOpInfo",
+ "name": "opInfo",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ }
+ ],
+ "name": "innerHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonceSequenceNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetCallData",
+ "type": "bytes"
+ }
+ ],
+ "name": "simulateHandleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateValidation",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "withdrawAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [],
+ "numDeployments": 1,
+ "solcInputHash": "a4c52f0671aad8941c53d6ead2063803",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://69643e83f68e6a13d5075c7565bfce326673b0bd98c432033c4603ea84835746\",\"dweb:/ipfs/QmSwSzjYyV7qudi5vvsmzHMG2Z4YJZxX51RRXXVCLaNcEU\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ff83c59432e733bf6304dda27cd4b0f34401917dd535e2669cc842d2d26568c\",\"dweb:/ipfs/QmPJbHU5TAjHqUTZzAcicEeG2nknmwCN43L4EW9LHbknTN\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}",
+ "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
+ "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/solcInputs/a4c52f0671aad8941c53d6ead2063803.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
new file mode 100644
index 000000000..dd58ba5a3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
@@ -0,0 +1,68 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/.chainId
new file mode 100644
index 000000000..105d7d9ad
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/.chainId
@@ -0,0 +1 @@
+100
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/EntryPoint.json
new file mode 100644
index 000000000..916c23908
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/EntryPoint.json
@@ -0,0 +1,1318 @@
+{
+ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "paid",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bool",
+ "name": "targetSuccess",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetResult",
+ "type": "bytes"
+ }
+ ],
+ "name": "ExecutionResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SenderAddressResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureValidationFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct IEntryPoint.AggregatorStakeInfo",
+ "name": "aggregatorInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResultWithAggregation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "factory",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "AccountDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "BeforeExecution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalDeposit",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposited",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureAggregatorChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStaked",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeLocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasUsed",
+ "type": "uint256"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawn",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "SIG_VALIDATION_FAILED",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ }
+ ],
+ "name": "_validateSenderAndPaymaster",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "depositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "deposits",
+ "outputs": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getDepositInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "internalType": "struct IStakeManager.DepositInfo",
+ "name": "info",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "getUserOpHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "userOps",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "contract IAggregator",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.UserOpsPerAggregator[]",
+ "name": "opsPerAggregator",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleAggregatedOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "incrementNonce",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.MemoryUserOp",
+ "name": "mUserOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "contextOffset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.UserOpInfo",
+ "name": "opInfo",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ }
+ ],
+ "name": "innerHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonceSequenceNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetCallData",
+ "type": "bytes"
+ }
+ ],
+ "name": "simulateHandleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateValidation",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "withdrawAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [],
+ "numDeployments": 1,
+ "solcInputHash": "a4c52f0671aad8941c53d6ead2063803",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://69643e83f68e6a13d5075c7565bfce326673b0bd98c432033c4603ea84835746\",\"dweb:/ipfs/QmSwSzjYyV7qudi5vvsmzHMG2Z4YJZxX51RRXXVCLaNcEU\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ff83c59432e733bf6304dda27cd4b0f34401917dd535e2669cc842d2d26568c\",\"dweb:/ipfs/QmPJbHU5TAjHqUTZzAcicEeG2nknmwCN43L4EW9LHbknTN\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}",
+ "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
+ "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/solcInputs/a4c52f0671aad8941c53d6ead2063803.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
new file mode 100644
index 000000000..dd58ba5a3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
@@ -0,0 +1,68 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/.chainId
new file mode 100644
index 000000000..7813681f5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/.chainId
@@ -0,0 +1 @@
+5
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/EntryPoint.json
new file mode 100644
index 000000000..916c23908
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/EntryPoint.json
@@ -0,0 +1,1318 @@
+{
+ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "paid",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bool",
+ "name": "targetSuccess",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetResult",
+ "type": "bytes"
+ }
+ ],
+ "name": "ExecutionResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SenderAddressResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureValidationFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct IEntryPoint.AggregatorStakeInfo",
+ "name": "aggregatorInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResultWithAggregation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "factory",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "AccountDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "BeforeExecution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalDeposit",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposited",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureAggregatorChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStaked",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeLocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasUsed",
+ "type": "uint256"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawn",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "SIG_VALIDATION_FAILED",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ }
+ ],
+ "name": "_validateSenderAndPaymaster",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "depositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "deposits",
+ "outputs": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getDepositInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "internalType": "struct IStakeManager.DepositInfo",
+ "name": "info",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "getUserOpHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "userOps",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "contract IAggregator",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.UserOpsPerAggregator[]",
+ "name": "opsPerAggregator",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleAggregatedOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "incrementNonce",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.MemoryUserOp",
+ "name": "mUserOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "contextOffset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.UserOpInfo",
+ "name": "opInfo",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ }
+ ],
+ "name": "innerHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonceSequenceNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetCallData",
+ "type": "bytes"
+ }
+ ],
+ "name": "simulateHandleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateValidation",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "withdrawAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [],
+ "numDeployments": 1,
+ "solcInputHash": "a4c52f0671aad8941c53d6ead2063803",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://69643e83f68e6a13d5075c7565bfce326673b0bd98c432033c4603ea84835746\",\"dweb:/ipfs/QmSwSzjYyV7qudi5vvsmzHMG2Z4YJZxX51RRXXVCLaNcEU\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ff83c59432e733bf6304dda27cd4b0f34401917dd535e2669cc842d2d26568c\",\"dweb:/ipfs/QmPJbHU5TAjHqUTZzAcicEeG2nknmwCN43L4EW9LHbknTN\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}",
+ "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
+ "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/solcInputs/a4c52f0671aad8941c53d6ead2063803.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
new file mode 100644
index 000000000..dd58ba5a3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
@@ -0,0 +1,68 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/.chainId
new file mode 100644
index 000000000..f70d7bba4
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/.chainId
@@ -0,0 +1 @@
+42
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/EntryPoint.json
new file mode 100644
index 000000000..00ddccecc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/EntryPoint.json
@@ -0,0 +1,1073 @@
+{
+ "address": "0xF63621e54F16eC6e4A732e44EaA7708935f259eF",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_create2factory",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_perOpOverhead",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint32",
+ "name": "_unstakeDelayBlocks",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "reason",
+ "type": "bytes"
+ }
+ ],
+ "name": "PaymasterPostOpFailed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStake",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelayBlocks",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawBlock",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocking",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasPrice",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "addDeposit",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "addDepositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "_unstakeDelayBlocks",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "create2factory",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "paymasters",
+ "type": "address[]"
+ }
+ ],
+ "name": "getPaymastersStake",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "_stakes",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_salt",
+ "type": "uint256"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "getStakeInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint96",
+ "name": "stake",
+ "type": "uint96"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelayBlocks",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint96",
+ "name": "withdrawStake",
+ "type": "uint96"
+ },
+ {
+ "internalType": "uint32",
+ "name": "withdrawBlock",
+ "type": "uint32"
+ }
+ ],
+ "internalType": "struct StakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address payable",
+ "name": "redeemer",
+ "type": "address"
+ }
+ ],
+ "name": "handleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "redeemer",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "enum EntryPoint.PaymentMode",
+ "name": "paymentMode",
+ "type": "uint8"
+ }
+ ],
+ "name": "internalHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "addr",
+ "type": "address"
+ }
+ ],
+ "name": "isContractDeployed",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ }
+ ],
+ "name": "isPaymasterStaked",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "requiredStake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "requiredDelayBlocks",
+ "type": "uint256"
+ }
+ ],
+ "name": "isStaked",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "perOpOverhead",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "uint256",
+ "name": "gasUsedByPayForSelfOp",
+ "type": "uint256"
+ }
+ ],
+ "name": "simulatePaymasterValidation",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "gasUsedByPayForOp",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateWalletValidation",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "gasUsedByPayForSelfOp",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "stakes",
+ "outputs": [
+ {
+ "internalType": "uint96",
+ "name": "stake",
+ "type": "uint96"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelayBlocks",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint96",
+ "name": "withdrawStake",
+ "type": "uint96"
+ },
+ {
+ "internalType": "uint32",
+ "name": "withdrawBlock",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unstakeDelayBlocks",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [
+ "0xce0042B868300000d44A59004Da54A005ffdcf9f",
+ 22000,
+ 100
+ ],
+ "solcInputHash": "9255faacf3ae4e81db1326413027bfa0",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_create2factory\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_perOpOverhead\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_unstakeDelayBlocks\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"PaymasterPostOpFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStake\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelayBlocks\",\"type\":\"uint256\"}],\"name\":\"StakeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawBlock\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocking\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"addDepositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_unstakeDelayBlocks\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"create2factory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"paymasters\",\"type\":\"address[]\"}],\"name\":\"getPaymastersStake\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_stakes\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_salt\",\"type\":\"uint256\"}],\"name\":\"getSenderAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"getStakeInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelayBlocks\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"withdrawStake\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"withdrawBlock\",\"type\":\"uint32\"}],\"internalType\":\"struct StakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address payable\",\"name\":\"redeemer\",\"type\":\"address\"}],\"name\":\"handleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"redeemer\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"enum EntryPoint.PaymentMode\",\"name\":\"paymentMode\",\"type\":\"uint8\"}],\"name\":\"internalHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isContractDeployed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"}],\"name\":\"isPaymasterStaked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"requiredStake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requiredDelayBlocks\",\"type\":\"uint256\"}],\"name\":\"isStaked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"perOpOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"gasUsedByPayForSelfOp\",\"type\":\"uint256\"}],\"name\":\"simulatePaymasterValidation\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasUsedByPayForOp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateWalletValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gasUsedByPayForSelfOp\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"stakes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelayBlocks\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"withdrawStake\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"withdrawBlock\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unstakeDelayBlocks\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"handleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes),address)\":{\"params\":{\"op\":\"the operation to execute\",\"redeemer\":\"the contract to redeem the fee\"}},\"simulatePaymasterValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes),uint256)\":{\"params\":{\"gasUsedByPayForSelfOp\":\"- the gas returned by simulateWalletValidation, as these 2 calls should share the same userOp.validationGas quota. The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the paymaster's data\",\"userOp\":\"the user operation to validate.\"}},\"simulateWalletValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes))\":{\"returns\":{\"gasUsedByPayForSelfOp\":\"- gas used by the validation, to pass into simulatePaymasterValidation. The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the wallet's data\"}}},\"version\":1},\"userdoc\":{\"events\":{\"StakeUnlocking(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"}},\"kind\":\"user\",\"methods\":{\"addDeposit()\":{\"notice\":\"add a deposit (just like stake, but with lock=0 cancel any pending unlock\"},\"addStake(uint32)\":{\"notice\":\"add stake value for this paymaster. cancel any pending unlock\"},\"handleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes),address)\":{\"notice\":\"Execute the given UserOperation.\"},\"simulatePaymasterValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes),uint256)\":{\"notice\":\"Simulate a call to paymaster.verifyPaymasterUserOp do nothing if has no paymaster.\"},\"simulateWalletValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Simulate a call for wallet.verifyUserOp. Call must not revert.\"},\"stakes(address)\":{\"notice\":\"maps relay managers to their stakes\"},\"unstakeDelayBlocks()\":{\"notice\":\"minimum number of blocks to after 'unlock' before amount can be withdrawn.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/EntryPoint.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"./StakeManager.sol\\\";\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IWallet.sol\\\";\\nimport \\\"./IPaymaster.sol\\\";\\n\\ninterface ICreate2Deployer {\\n function deploy(bytes memory _initCode, bytes32 _salt) external returns (address);\\n}\\n\\ncontract EntryPoint is StakeManager {\\n\\n using UserOperationLib for UserOperation;\\n // paymaster locked stake\\n // (actual stake should be higher, to cover actual call cost)\\n uint256 constant PAYMASTER_STAKE = 1 ether;\\n\\n enum PaymentMode {\\n paymasterStake, // if paymaster is set, use paymaster's stake to pay.\\n walletStake, // wallet has enough stake to pay for request.\\n walletEth // wallet has no stake. paying with eth.\\n }\\n\\n uint public immutable perOpOverhead;\\n address public immutable create2factory;\\n\\n event UserOperationEvent(address indexed sender, address indexed paymaster, uint nonce, uint actualGasCost, uint actualGasPrice, bool success);\\n event UserOperationRevertReason(address indexed sender, uint nonce, bytes revertReason);\\n\\n event PaymasterPostOpFailed(address indexed sender, address indexed paymaster, uint nonce, bytes reason);\\n\\n //handleOps reverts with this error struct, to mark the offending op\\n // NOTE: if simulateOp passes successfully, there should be no reason for handleOps to fail on it.\\n // @param opIndex - index into the array of ops to the failed one (in simulateOp, this is always zero)\\n // @param paymaster - if paymaster.verifyPaymasterUserOp fails, this will be the paymaster's address. if verifyUserOp failed,\\n // this value will be zero (since it failed before accessing the paymaster)\\n // @param reason - revert reason\\n // only to aid troubleshooting of wallet/paymaster reverts\\n error FailedOp(uint opIndex, address paymaster, string reason);\\n\\n constructor(address _create2factory, uint _perOpOverhead, uint32 _unstakeDelayBlocks) StakeManager(_unstakeDelayBlocks) {\\n create2factory = _create2factory;\\n perOpOverhead = _perOpOverhead;\\n }\\n\\n receive() external payable {}\\n\\n /**\\n * Execute the given UserOperation.\\n * @param op the operation to execute\\n * @param redeemer the contract to redeem the fee\\n */\\n function handleOp(UserOperation calldata op, address payable redeemer) public {\\n\\n uint preGas = gasleft();\\n\\n (uint256 prefund, PaymentMode paymentMode, bytes memory context) = _validatePrepayment(0, op);\\n uint preOpGas = preGas - gasleft() + perOpOverhead;\\n\\n uint actualGasCost;\\n\\n try this.internalHandleOp(op, context, preOpGas, prefund, paymentMode) returns (uint _actualGasCost) {\\n actualGasCost = _actualGasCost;\\n } catch {\\n uint actualGas = preGas - gasleft() + preOpGas;\\n actualGasCost = handlePostOp(IPaymaster.PostOpMode.postOpReverted, op, context, actualGas, prefund, paymentMode);\\n }\\n\\n redeem(redeemer, actualGasCost);\\n }\\n\\n function redeem(address payable redeemer, uint amount) internal {\\n redeemer.transfer(amount);\\n }\\n\\n function handleOps(UserOperation[] calldata ops, address payable redeemer) public {\\n\\n uint opslen = ops.length;\\n uint256[] memory preOpGas = new uint256[](opslen);\\n bytes32[] memory contexts = new bytes32[](opslen);\\n uint256[] memory prefunds = new uint256[](opslen);\\n PaymentMode[] memory paymentModes = new PaymentMode[](opslen);\\n\\n for (uint i = 0; i < opslen; i++) {\\n uint preGas = gasleft();\\n UserOperation calldata op = ops[i];\\n\\n bytes memory context;\\n bytes32 contextOffset;\\n (prefunds[i], paymentModes[i], context) = _validatePrepayment(i, op);\\n assembly {contextOffset := context}\\n contexts[i] = contextOffset;\\n preOpGas[i] = preGas - gasleft() + perOpOverhead;\\n }\\n\\n uint collected = 0;\\n\\n for (uint i = 0; i < ops.length; i++) {\\n uint preGas = gasleft();\\n UserOperation calldata op = ops[i];\\n bytes32 contextOffset = contexts[i];\\n bytes memory context;\\n assembly {context := contextOffset}\\n uint preOpGasi = preOpGas[i];\\n uint prefundi = prefunds[i];\\n PaymentMode paymentModei = paymentModes[i];\\n\\n try this.internalHandleOp(op, context, preOpGasi, prefundi, paymentModei) returns (uint _actualGasCost) {\\n collected += _actualGasCost;\\n } catch {\\n uint actualGas = preGas - gasleft() + preOpGasi;\\n collected += handlePostOp(IPaymaster.PostOpMode.postOpReverted, op, context, actualGas, prefundi, paymentModei);\\n }\\n }\\n\\n redeem(redeemer, collected);\\n }\\n\\n function internalHandleOp(UserOperation calldata op, bytes calldata context, uint preOpGas, uint prefund, PaymentMode paymentMode) external returns (uint actualGasCost) {\\n uint preGas = gasleft();\\n require(msg.sender == address(this));\\n\\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\\n if (op.callData.length > 0) {\\n\\n (bool success,bytes memory result) = address(op.getSender()).call{gas : op.callGas}(op.callData);\\n if (!success && result.length > 0) {\\n emit UserOperationRevertReason(op.getSender(), op.nonce, result);\\n mode = IPaymaster.PostOpMode.opReverted;\\n }\\n }\\n\\n uint actualGas = preGas - gasleft() + preOpGas;\\n return handlePostOp(mode, op, context, actualGas, prefund, paymentMode);\\n }\\n\\n /**\\n * Simulate a call for wallet.verifyUserOp.\\n * Call must not revert.\\n * @return gasUsedByPayForSelfOp - gas used by the validation, to pass into simulatePaymasterValidation.\\n * The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the wallet's data\\n */\\n function simulateWalletValidation(UserOperation calldata userOp) external returns (uint gasUsedByPayForSelfOp){\\n require(msg.sender == address(0), \\\"must be called off-chain with from=zero-addr\\\");\\n (uint requiredPreFund, PaymentMode paymentMode) = getPaymentInfo(userOp);\\n (gasUsedByPayForSelfOp,) = _validateWalletPrepayment(0, userOp, requiredPreFund, paymentMode);\\n }\\n\\n function getPaymentInfo(UserOperation calldata userOp) internal view returns (uint requiredPrefund, PaymentMode paymentMode) {\\n requiredPrefund = userOp.requiredPreFund(perOpOverhead);\\n if (userOp.hasPaymaster()) {\\n paymentMode = PaymentMode.paymasterStake;\\n } else if (isStaked(userOp.getSender(), requiredPrefund, 0)) {\\n paymentMode = PaymentMode.walletStake;\\n } else {\\n paymentMode = PaymentMode.walletEth;\\n }\\n }\\n\\n /**\\n * Simulate a call to paymaster.verifyPaymasterUserOp\\n * do nothing if has no paymaster.\\n * @param userOp the user operation to validate.\\n * @param gasUsedByPayForSelfOp - the gas returned by simulateWalletValidation, as these 2 calls should share\\n * the same userOp.validationGas quota.\\n * The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the paymaster's data\\n */\\n function simulatePaymasterValidation(UserOperation calldata userOp, uint gasUsedByPayForSelfOp) external view returns (bytes memory context, uint gasUsedByPayForOp){\\n (uint requiredPreFund, PaymentMode paymentMode) = getPaymentInfo(userOp);\\n if (paymentMode != PaymentMode.paymasterStake) {\\n return (\\\"\\\", 0);\\n }\\n return _validatePaymasterPrepayment(0, userOp, requiredPreFund, gasUsedByPayForSelfOp);\\n }\\n\\n // get the sender address, or use \\\"create2\\\" to create it.\\n // note that the gas allocation for this creation is deterministic (by the size of callData),\\n // so it is not checked on-chain, and adds to the gas used by verifyUserOp\\n function _createSenderIfNeeded(UserOperation calldata op) internal {\\n if (op.initCode.length != 0) {\\n //its a create operation. run the create2\\n // note that we're still under the gas limit of validate, so probably\\n // this create2 creates a proxy account.\\n // appending signer makes the request unique, so no one else can make this request.\\n //nonce is meaningless during create, so we re-purpose it as salt\\n address sender1 = ICreate2Deployer(create2factory).deploy(op.initCode, bytes32(op.nonce));\\n require(sender1 != address(0), \\\"create2 failed\\\");\\n require(sender1 == op.getSender(), \\\"sender doesn't match create2 address\\\");\\n }\\n }\\n\\n //get counterfactual sender address.\\n // use the initCode and salt in the UserOperation tot create this sender contract\\n function getSenderAddress(bytes memory initCode, uint _salt) public view returns (address) {\\n bytes32 hash = keccak256(\\n abi.encodePacked(\\n bytes1(0xff),\\n address(create2factory),\\n _salt,\\n keccak256(initCode)\\n )\\n );\\n\\n // NOTE: cast last 20 bytes of hash to address\\n return address(uint160(uint256(hash)));\\n }\\n\\n //call wallet.verifyUserOp, and validate that it paid as needed.\\n // return actual value sent from wallet to \\\"this\\\"\\n function _validateWalletPrepayment(uint opIndex, UserOperation calldata op, uint requiredPrefund, PaymentMode paymentMode) internal returns (uint gasUsedByPayForSelfOp, uint prefund) {\\n uint preGas = gasleft();\\n _createSenderIfNeeded(op);\\n uint preBalance = address(this).balance;\\n uint requiredEthPrefund = 0;\\n if (paymentMode == PaymentMode.walletEth) {\\n requiredEthPrefund = requiredPrefund;\\n } else if (paymentMode == PaymentMode.walletStake) {\\n _prefundFromSender(op, requiredPrefund);\\n } else {\\n // paymaster pays in handlePostOp\\n }\\n try IWallet(op.getSender()).verifyUserOp{gas : op.verificationGas}(op, requiredEthPrefund) {\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, address(0), revertReason);\\n } catch {\\n revert FailedOp(opIndex, address(0), \\\"\\\");\\n }\\n uint actualEthPrefund = address(this).balance - preBalance;\\n\\n if (paymentMode == PaymentMode.walletEth) {\\n if (actualEthPrefund < requiredEthPrefund) {\\n revert FailedOp(opIndex, address(0), \\\"wallet didn't pay prefund\\\");\\n }\\n prefund = actualEthPrefund;\\n } else if (paymentMode == PaymentMode.walletStake) {\\n if (actualEthPrefund != 0) {\\n revert FailedOp(opIndex, address(0), \\\"using wallet stake but wallet paid eth\\\");\\n }\\n prefund = requiredPrefund;\\n } else {\\n if (actualEthPrefund != 0) {\\n revert FailedOp(opIndex, address(0), \\\"has paymaster but wallet paid\\\");\\n }\\n prefund = requiredPrefund;\\n }\\n\\n gasUsedByPayForSelfOp = preGas - gasleft();\\n }\\n\\n //validate paymaster.verifyPaymasterUserOp\\n function _validatePaymasterPrepayment(uint opIndex, UserOperation calldata op, uint requiredPreFund, uint gasUsedByPayForSelfOp) internal view returns (bytes memory context, uint gasUsedByPayForOp) {\\n uint preGas = gasleft();\\n if (!isValidStake(op, requiredPreFund)) {\\n revert FailedOp(opIndex, op.paymaster, \\\"not enough stake\\\");\\n }\\n //no pre-pay from paymaster\\n uint gas = op.verificationGas - gasUsedByPayForSelfOp;\\n try IPaymaster(op.paymaster).verifyPaymasterUserOp{gas : gas}(op, requiredPreFund) returns (bytes memory _context){\\n context = _context;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, op.paymaster, revertReason);\\n } catch {\\n revert FailedOp(opIndex, op.paymaster, \\\"\\\");\\n }\\n gasUsedByPayForOp = preGas - gasleft();\\n }\\n\\n function _validatePrepayment(uint opIndex, UserOperation calldata userOp) private returns (uint prefund, PaymentMode paymentMode, bytes memory context){\\n\\n uint preGas = gasleft();\\n uint gasUsedByPayForSelfOp;\\n uint requiredPreFund;\\n (requiredPreFund, paymentMode) = getPaymentInfo(userOp);\\n\\n (gasUsedByPayForSelfOp, prefund) = _validateWalletPrepayment(opIndex, userOp, requiredPreFund, paymentMode);\\n\\n uint gasUsedByPayForOp = 0;\\n if (paymentMode == PaymentMode.paymasterStake) {\\n (context, gasUsedByPayForOp) = _validatePaymasterPrepayment(opIndex, userOp, requiredPreFund, gasUsedByPayForSelfOp);\\n } else {\\n context = \\\"\\\";\\n }\\n uint gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGas < gasUsed) {\\n revert FailedOp(opIndex, userOp.paymaster, \\\"Used more than verificationGas\\\");\\n }\\n }\\n\\n function getPaymastersStake(address[] calldata paymasters) external view returns (uint[] memory _stakes) {\\n _stakes = new uint[](paymasters.length);\\n for (uint i = 0; i < paymasters.length; i++) {\\n _stakes[i] = stakes[paymasters[i]].stake;\\n }\\n }\\n\\n function handlePostOp(IPaymaster.PostOpMode mode, UserOperation calldata op, bytes memory context, uint actualGas, uint prefund, PaymentMode paymentMode) private returns (uint actualGasCost) {\\n uint preGas = gasleft();\\n uint gasPrice = UserOperationLib.gasPrice(op);\\n actualGasCost = actualGas * gasPrice;\\n if (paymentMode != PaymentMode.paymasterStake) {\\n if (prefund < actualGasCost) {\\n revert (\\\"wallet prefund below actualGasCost\\\");\\n }\\n uint refund = prefund - actualGasCost;\\n if (paymentMode == PaymentMode.walletStake) {\\n _refundSenderStake(op, refund);\\n } else {\\n _refundSender(op, refund);\\n }\\n } else {\\n if (context.length > 0) {\\n //if paymaster.postOp reverts:\\n // - emit a message (just for sake of debugging of this poor paymaster)\\n // - paymaster still pays (from its stake)\\n try IPaymaster(op.paymaster).postOp(mode, context, actualGasCost) {}\\n catch (bytes memory errdata) {\\n emit PaymasterPostOpFailed(op.getSender(), op.paymaster, op.nonce, errdata);\\n }\\n }\\n //paymaster pays for full gas, including for postOp (and revert event)\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n //paymaster balance known to be high enough, and to be locked for this block\\n stakes[op.paymaster].stake -= uint96(actualGasCost);\\n }\\n _emitLog(op, actualGasCost, gasPrice, mode == IPaymaster.PostOpMode.opSucceeded);\\n }\\n\\n function _emitLog(UserOperation calldata op, uint actualGasCost, uint gasPrice, bool success) internal {\\n emit UserOperationEvent(op.getSender(), op.paymaster, op.nonce, actualGasCost, gasPrice, success);\\n }\\n\\n function _prefundFromSender(UserOperation calldata userOp, uint requiredPrefund) internal {\\n stakes[userOp.getSender()].stake -= uint96(requiredPrefund);\\n }\\n\\n function _refundSender(UserOperation calldata userOp, uint refund) internal {\\n //NOTE: deliberately ignoring revert: wallet should accept refund.\\n bool sendOk = payable(userOp.getSender()).send(refund);\\n (sendOk);\\n }\\n function _refundSenderStake(UserOperation calldata userOp, uint refund) internal {\\n stakes[userOp.getSender()].stake += uint96(refund);\\n }\\n\\n function isValidStake(UserOperation calldata userOp, uint requiredPreFund) internal view returns (bool) {\\n return isPaymasterStaked(userOp.paymaster, PAYMASTER_STAKE + requiredPreFund);\\n }\\n\\n function isPaymasterStaked(address paymaster, uint stake) public view returns (bool) {\\n return isStaked(paymaster, stake, unstakeDelayBlocks);\\n }\\n\\n function isContractDeployed(address addr) external view returns (bool) {\\n bytes32 hash;\\n assembly {\\n hash := extcodehash(addr)\\n }\\n return hash != bytes32(0);\\n }\\n}\\n\\n\",\"keccak256\":\"0x8b15a6fcb66f95fc079400ff2b38de805405ce6c23c4bbbc1bcd24bb6cabefb0\",\"license\":\"GPL-3.0\"},\"contracts/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now its a 2nd call, after user's op was deliberately reverted.\\n }\\n // payment validation: check if paymaster agree to pay (using its stake)\\n // revert to reject this request.\\n // actual payment is done after postOp is called, by deducting actual call cost form the paymaster's stake.\\n // @param userOp the user operation\\n // @param maxcost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n // @returns context value to send to a postOp\\n // zero length to signify postOp is not required.\\n function verifyPaymasterUserOp(UserOperation calldata userOp, uint maxcost) external view returns (bytes memory context);\\n\\n // post-operation handler.\\n // @param mode\\n // opSucceeded - user operation succeeded.\\n // opReverted - user op reverted. still has to pay for gas.\\n // postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n // Now this is the 2nd call, after user's op was deliberately reverted.\\n // @param context - the context value returned by verifyPaymasterUserOp\\n // @param actualGasCost - actual gas used so far (without this postOp call).\\n function postOp(PostOpMode mode, bytes calldata context, uint actualGasCost) external;\\n}\\n\",\"keccak256\":\"0xef51907c5520d22e74cc7804b30634cdc6d2cbf2fe96b77d0b6785a53c4545a5\",\"license\":\"GPL-3.0\"},\"contracts/IWallet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IWallet {\\n\\n // validate user's signature and nonce\\n // @param requiredPrefund how much this wallet should pre-fund the transaction.\\n // @note that after execution, the excess is sent back to the wallet.\\n // @note if requiredPrefund is zero, the wallet MUST NOT send anything (the paymaster pays)\\n function verifyUserOp(UserOperation calldata userOp, uint requiredPrefund) external;\\n}\\n\",\"keccak256\":\"0x29f98a4e6033cd10007dcc9b569fda950413cc91d8560a67f20a35e8185c9228\",\"license\":\"GPL-3.0\"},\"contracts/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8;\\n\\nimport \\\"hardhat/console.sol\\\";\\n\\ncontract StakeManager {\\n\\n /// minimum number of blocks to after 'unlock' before amount can be withdrawn.\\n uint32 immutable public unstakeDelayBlocks;\\n\\n constructor(uint32 _unstakeDelayBlocks) {\\n unstakeDelayBlocks = _unstakeDelayBlocks;\\n }\\n\\n event StakeAdded(\\n address indexed paymaster,\\n uint256 totalStake,\\n uint256 unstakeDelayBlocks\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocking(\\n address indexed paymaster,\\n uint256 withdrawBlock\\n );\\n\\n event StakeWithdrawn(\\n address indexed paymaster,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// @param stake - amount of ether staked for this paymaster\\n /// @param withdrawStake - once 'unlocked' the value is no longer staked.\\n /// @param withdrawBlock - first block number 'withdraw' will be callable, or zero if the unlock has not been called\\n struct StakeInfo {\\n uint96 stake;\\n uint32 unstakeDelayBlocks;\\n uint96 withdrawStake;\\n uint32 withdrawBlock;\\n }\\n\\n /// maps relay managers to their stakes\\n mapping(address => StakeInfo) public stakes;\\n\\n function getStakeInfo(address paymaster) external view returns (StakeInfo memory stakeInfo) {\\n return stakes[paymaster];\\n }\\n\\n /**\\n * add a deposit (just like stake, but with lock=0\\n * cancel any pending unlock\\n */\\n function addDeposit() external payable {\\n addStake(0);\\n }\\n\\n //add deposit to another account (doesn't change lock status)\\n function addDepositTo(address target) external payable {\\n stakes[target].stake += uint96(msg.value);\\n }\\n\\n /**\\n * add stake value for this paymaster.\\n * cancel any pending unlock\\n */\\n function addStake(uint32 _unstakeDelayBlocks) public payable {\\n require(_unstakeDelayBlocks >= stakes[msg.sender].unstakeDelayBlocks, \\\"cannot decrease unstake blocks\\\");\\n uint96 stake = uint96(stakes[msg.sender].stake + msg.value + stakes[msg.sender].withdrawStake);\\n stakes[msg.sender] = StakeInfo(\\n stake,\\n _unstakeDelayBlocks,\\n 0,\\n 0);\\n emit StakeAdded(msg.sender, stake, _unstakeDelayBlocks);\\n }\\n\\n function unlockStake() external {\\n StakeInfo storage info = stakes[msg.sender];\\n require(info.withdrawBlock == 0, \\\"already pending\\\");\\n require(info.stake != 0 && info.unstakeDelayBlocks != 0, \\\"no stake to unlock\\\");\\n uint32 withdrawBlock = uint32(block.number) + info.unstakeDelayBlocks;\\n info.withdrawBlock = withdrawBlock;\\n info.withdrawStake = info.stake;\\n info.stake = 0;\\n emit StakeUnlocking(msg.sender, withdrawBlock);\\n }\\n\\n function withdrawStake(address payable withdrawAddress) external {\\n StakeInfo memory info = stakes[msg.sender];\\n if (info.unstakeDelayBlocks != 0) {\\n require(info.withdrawStake > 0, \\\"no unlocked stake\\\");\\n require(info.withdrawBlock <= block.number, \\\"Withdrawal is not due\\\");\\n }\\n uint256 amount = info.withdrawStake + info.stake;\\n stakes[msg.sender] = StakeInfo(0, info.unstakeDelayBlocks, 0, 0);\\n withdrawAddress.transfer(amount);\\n emit StakeWithdrawn(msg.sender, withdrawAddress, amount);\\n }\\n\\n function isStaked(address paymaster, uint requiredStake, uint requiredDelayBlocks) public view returns (bool) {\\n StakeInfo memory stakeInfo = stakes[paymaster];\\n return stakeInfo.stake >= requiredStake && stakeInfo.unstakeDelayBlocks >= requiredDelayBlocks;\\n }\\n}\\n\",\"keccak256\":\"0x238f903aceaaa89fd289d99c16ff660b6f911837f50ccf3fc3bb94653024b1aa\",\"license\":\"GPL-3.0-only\"},\"contracts/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"hardhat/console.sol\\\";\\n\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint callGas;\\n uint verificationGas;\\n uint preVerificationGas;\\n uint maxFeePerGas;\\n uint maxPriorityFeePerGas;\\n address paymaster;\\n bytes paymasterData;\\n bytes signature;\\n }\\n\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal view returns (address ret) {\\n assembly {ret := calldataload(userOp)}\\n }\\n\\n //relayer/miner might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint) {\\n unchecked {\\n return min(userOp.maxFeePerGas, userOp.maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function requiredGas(UserOperation calldata userOp) internal pure returns (uint) {\\n unchecked {\\n return userOp.callGas + userOp.verificationGas + userOp.preVerificationGas;\\n }\\n }\\n\\n function requiredPreFund(UserOperation calldata userOp, uint overhead) internal view returns (uint prefund) {\\n return (requiredGas(userOp) + overhead) * gasPrice(userOp);\\n }\\n\\n function hasPaymaster(UserOperation calldata userOp) internal pure returns (bool) {\\n return userOp.paymaster != address(0);\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n //lighter signature scheme. must match UserOp.ts#packUserOp\\n bytes calldata sig = userOp.signature;\\n assembly {\\n let ofs := userOp\\n let len := sub(sub(sig.offset, ofs), 32)\\n ret := mload(0x40)\\n mstore(0x40, add(ret, add(len, 32)))\\n mstore(ret, len)\\n calldatacopy(add(ret, 32), ofs, len)\\n }\\n return ret;\\n\\n //TODO: eip712-style ?\\n return abi.encode(\\n userOp.sender,\\n userOp.nonce,\\n keccak256(userOp.initCode),\\n keccak256(userOp.callData),\\n userOp.callGas,\\n userOp.verificationGas,\\n userOp.preVerificationGas,\\n userOp.maxFeePerGas,\\n userOp.maxPriorityFeePerGas,\\n userOp.paymaster,\\n keccak256(userOp.paymasterData)\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\",\\n keccak256(pack(userOp))));\\n }\\n\\n function min(uint a, uint b) internal pure returns (uint) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x7ea8383b9bbd8cfa5a96f59e1f37c20a681daa798b80d67eb52ade3c53f3ea30\",\"license\":\"GPL-3.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x72b6a1d297cd3b033d7c2e4a7e7864934bb767db6453623f1c3082c6534547f4\",\"license\":\"MIT\"}},\"version\":1}",
+ "bytecode": "0x60e06040523480156200001157600080fd5b5060405162002cc738038062002cc7833981016040819052620000349162000060565b60e01b6001600160e01b03191660805260609190911b6001600160601b03191660c05260a052620000bb565b6000806000606084860312156200007657600080fd5b83516001600160a01b03811681146200008e57600080fd5b60208501516040860151919450925063ffffffff81168114620000b057600080fd5b809150509250925092565b60805160e01c60a05160c05160601c612bac6200011b60003960008181610156015281816103e50152611f350152600081816102af01528181610a0a01528181611330015261187101526000818161056e01526107f50152612bac6000f3fe6080604052600436106101235760003560e01c8063af2ed7d7116100a0578063c345315311610064578063c345315314610446578063dbbabd6a1461053c578063e7c350e31461055c578063f20751eb146105a5578063f3737f19146105c657600080fd5b8063af2ed7d71461033a578063bb9fe6bf1461035a578063bf55512e1461036f578063c23a5cea1461038f578063c31e4354146103af57600080fd5b80632815c17b116100e75780632815c17b146102755780634a58db1914610295578063643407ce1461029d578063739b8950146102df578063828190131461030c57600080fd5b80630396cb601461012f5780630bfb68471461014457806316934fc4146101955780631c112a44146102255780631fa75c861461025557600080fd5b3661012a57005b600080fd5b61014261013d366004612540565b6105d9565b005b34801561015057600080fd5b506101787f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101a157600080fd5b506101ee6101b0366004612161565b6000602081905290815260409020546001600160601b038082169163ffffffff600160601b8204811692600160801b83041691600160e01b90041684565b604080516001600160601b03958616815263ffffffff9485166020820152949092169184019190915216606082015260800161018c565b34801561023157600080fd5b506102456102403660046121c7565b610764565b604051901515815260200161018c565b34801561026157600080fd5b5061024561027036600461219b565b6107ec565b34801561028157600080fd5b5061014261029036600461223d565b610826565b610142610c24565b3480156102a957600080fd5b506102d17f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161018c565b3480156102eb57600080fd5b506102ff6102fa3660046121fc565b610c30565b60405161018c91906126dd565b34801561031857600080fd5b5061032c6103273660046124e3565b610d09565b60405161018c929190612745565b34801561034657600080fd5b506102d161035536600461242a565b610d70565b34801561036657600080fd5b50610142610ee2565b34801561037b57600080fd5b506102d161038a36600461239d565b611055565b34801561039b57600080fd5b506101426103aa366004612161565b6110e0565b3480156103bb57600080fd5b506101786103ca366004612314565b8151602092830120604080516001600160f81b0319818601527f000000000000000000000000000000000000000000000000000000000000000060601b6bffffffffffffffffffffffff191660218201526035810193909352605580840192909252805180840390920182526075909201909152805191012090565b34801561045257600080fd5b506104eb610461366004612161565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b031660009081526020818152604091829020825160808101845290546001600160601b03808216835263ffffffff600160601b8304811694840194909452600160801b82041693820193909352600160e01b90920416606082015290565b60405161018c919060006080820190506001600160601b03808451168352602084015163ffffffff808216602086015282604087015116604086015280606087015116606086015250505092915050565b34801561054857600080fd5b506101426105573660046123d9565b611311565b34801561056857600080fd5b506105907f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161018c565b3480156105b157600080fd5b506102456105c0366004612161565b3f151590565b6101426105d4366004612161565b61142b565b3360009081526020819052604090205463ffffffff600160601b9091048116908216101561064e5760405162461bcd60e51b815260206004820152601e60248201527f63616e6e6f7420646563726561736520756e7374616b6520626c6f636b73000060448201526064015b60405180910390fd5b336000908152602081905260408120546001600160601b03600160801b820481169161067c9134911661290f565b610686919061290f565b604080516080810182526001600160601b0383811680835263ffffffff878116602080860182815260008789018181526060890182815233808452838652928b902099518a54945192519151908a166001600160801b031990951694909417600160601b92881692909202919091176001600160801b0316600160801b91909816026001600160e01b031696909617600160e01b91909416029290921790945584519182528101929092529293507f270d6dd254edd1d985c81cf7861b8f28fb06b6d719df04d90464034d4341244091015b60405180910390a25050565b6001600160a01b038316600090815260208181526040808320815160808101835290546001600160601b0380821680845263ffffffff600160601b8404811696850196909652600160801b830490911693830193909352600160e01b9004909216606083015284118015906107e3575082816020015163ffffffff1610155b95945050505050565b600061081f83837f000000000000000000000000000000000000000000000000000000000000000063ffffffff16610764565b9392505050565b816000816001600160401b0381111561084157610841612a88565b60405190808252806020026020018201604052801561086a578160200160208202803683370190505b5090506000826001600160401b0381111561088757610887612a88565b6040519080825280602002602001820160405280156108b0578160200160208202803683370190505b5090506000836001600160401b038111156108cd576108cd612a88565b6040519080825280602002602001820160405280156108f6578160200160208202803683370190505b5090506000846001600160401b0381111561091357610913612a88565b60405190808252806020026020018201604052801561093c578160200160208202803683370190505b50905060005b85811015610a735760005a9050368a8a8481811061096257610962612a72565b90506020028101906109749190612882565b9050606060006109848584611483565b89888151811061099657610996612a72565b602002602001018989815181106109af576109af612a72565b602002602001018296508360028111156109cb576109cb612a5c565b60028111156109dc576109dc612a5c565b81525083815250505050819050808886815181106109fc576109fc612a72565b6020026020010181815250507f00000000000000000000000000000000000000000000000000000000000000005a610a349086612990565b610a3e919061290f565b898681518110610a5057610a50612a72565b602002602001018181525050505050508080610a6b90612a2b565b915050610942565b506000805b88811015610c0e5760005a9050368b8b84818110610a9857610a98612a72565b9050602002810190610aaa9190612882565b90506000878481518110610ac057610ac0612a72565b60200260200101519050606081905060008a8681518110610ae357610ae3612a72565b602002602001015190506000898781518110610b0157610b01612a72565b602002602001015190506000898881518110610b1f57610b1f612a72565b60200260200101519050306001600160a01b031663af2ed7d787868686866040518663ffffffff1660e01b8152600401610b5d959493929190612799565b602060405180830381600087803b158015610b7757600080fd5b505af1925050508015610ba7575060408051601f3d908101601f19168201909252610ba491810190612527565b60015b610be6576000835a610bb9908a612990565b610bc3919061290f565b9050610bd460028887848787611589565b610bde908b61290f565b995050610bf4565b610bf0818b61290f565b9950505b505050505050508080610c0690612a2b565b915050610a78565b50610c19878261182d565b505050505050505050565b610c2e60006105d9565b565b6060816001600160401b03811115610c4a57610c4a612a88565b604051908082528060200260200182016040528015610c73578160200160208202803683370190505b50905060005b82811015610d0257600080858584818110610c9657610c96612a72565b9050602002016020810190610cab9190612161565b6001600160a01b0316815260208101919091526040016000205482516001600160601b0390911690839083908110610ce557610ce5612a72565b602090810291909101015280610cfa81612a2b565b915050610c79565b5092915050565b60606000806000610d1986611868565b90925090506000816002811115610d3257610d32612a5c565b14610d555760006040518060200160405280600081525090935093505050610d69565b610d6260008784886118cf565b9350935050505b9250929050565b6000805a9050333014610d8257600080fd5b600080610d9260608b018b61283c565b90501115610e74576000808a356001600160a01b031660808c0135610dba60608e018e61283c565b604051610dc89291906126cd565b60006040518083038160008787f1925050503d8060008114610e06576040519150601f19603f3d011682016040523d82523d6000602084013e610e0b565b606091505b509150915081158015610e1f575060008151115b15610e71578a356001600160a01b03167fbe4889eb241fb33bc0e9873f6e442f4c5dc653a55e7ad8bca2f001c9b3d818fb8c6020013583604051610e64929190612823565b60405180910390a2600192505b50505b6000865a610e829085612990565b610e8c919061290f565b9050610ed4828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792508c91508b9050611589565b9a9950505050505050505050565b3360009081526020819052604090208054600160e01b900463ffffffff1615610f3f5760405162461bcd60e51b815260206004820152600f60248201526e616c72656164792070656e64696e6760881b6044820152606401610645565b80546001600160601b031615801590610f6557508054600160601b900463ffffffff1615155b610fa65760405162461bcd60e51b81526020600482015260126024820152716e6f207374616b6520746f20756e6c6f636b60701b6044820152606401610645565b8054600090610fc290600160601b900463ffffffff1643612927565b82546001600160801b0381166bffffffffffffffffffffffff60801b19600160e01b63ffffffff8516908102918216929092176001600160601b039384169190931617600160801b02919091176bffffffffffffffffffffffff1916845560405190815290915033907fab3a43860ac8cdb29929ba1a1f556b4decf9617f4811c190010e1672e55839b190602001610758565b600033156110ba5760405162461bcd60e51b815260206004820152602c60248201527f6d7573742062652063616c6c6564206f66662d636861696e207769746820667260448201526b37b69ebd32b93796b0b2323960a11b6064820152608401610645565b6000806110c684611868565b915091506110d76000858484611aab565b50949350505050565b3360009081526020818152604091829020825160808101845290546001600160601b03808216835263ffffffff600160601b83048116948401859052600160801b830490911694830194909452600160e01b90049092166060830152156111e457600081604001516001600160601b0316116111925760405162461bcd60e51b81526020600482015260116024820152706e6f20756e6c6f636b6564207374616b6560781b6044820152606401610645565b43816060015163ffffffff1611156111e45760405162461bcd60e51b81526020600482015260156024820152745769746864726177616c206973206e6f742064756560581b6044820152606401610645565b805160408201516000916111f79161294f565b60408051608081018252600080825260208681015163ffffffff9081168285019081528486018481526060860185815233865293859052868520955186549251915194518416600160e01b026001600160e01b036001600160601b03968716600160801b02166001600160801b0393909516600160601b026001600160801b031990941691861691909117929092171691909117179092559151921692506001600160a01b0385169183156108fc0291849190818181858888f193505050501580156112c7573d6000803e3d6000fd5b50604080516001600160a01b03851681526020810183905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3910160405180910390a2505050565b60005a90506000806000611326600087611483565b92509250925060007f00000000000000000000000000000000000000000000000000000000000000005a61135a9087612990565b611364919061290f565b60405163af2ed7d760e01b8152909150600090309063af2ed7d790611395908b90879087908b908b90600401612799565b602060405180830381600087803b1580156113af57600080fd5b505af19250505080156113df575060408051601f3d908101601f191682019092526113dc91810190612527565b60015b611414576000825a6113f19089612990565b6113fb919061290f565b905061140c60028a86848a8a611589565b915050611417565b90505b611421878261182d565b5050505050505050565b6001600160a01b0381166000908152602081905260408120805434929061145c9084906001600160601b031661294f565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050565b600080606060005a905060008061149987611868565b955090506114a988888388611aab565b965091506000808660028111156114c2576114c2612a5c565b14156114de576114d4898984866118cf565b90955090506114f1565b6040518060200160405280600081525094505b60005a6114fe9086612990565b9050808960a00135101561157d578961151f6101408b016101208c01612161565b60405162fa072b60e01b815260048101929092526001600160a01b0316602482015260606044820152601e60648201527f55736564206d6f7265207468616e20766572696669636174696f6e4761730000608482015260a401610645565b50505050509250925092565b6000805a9050600061159a88611d77565b90506115a68187612971565b925060008460028111156115bc576115bc612a5c565b14611663578285101561161c5760405162461bcd60e51b815260206004820152602260248201527f77616c6c65742070726566756e642062656c6f772061637475616c476173436f6044820152611cdd60f21b6064820152608401610645565b60006116288487612990565b9050600185600281111561163e5761163e612a5c565b14156116535761164e8982611d94565b61165d565b61165d8982611dee565b50611801565b86511561176f5761167c61014089016101208a01612161565b6001600160a01b031663a9a234098a89866040518463ffffffff1660e01b81526004016116ab93929190612767565b600060405180830381600087803b1580156116c557600080fd5b505af19250505080156116d6575060015b61176f573d808015611704576040519150601f19603f3d011682016040523d82523d6000602084013e611709565b606091505b5061171c6101408a016101208b01612161565b6001600160a01b031689356001600160a01b03167f45197bfe91c32368fd75a4fcab42a1eff7699e79df0e171a343537be7657efb68b6020013584604051611765929190612823565b60405180910390a3505b5a61177a9083612990565b611784908761290f565b95506117908187612971565b9250826000806117a86101408c016101208d01612161565b6001600160a01b031681526020810191909152604001600090812080549091906117dc9084906001600160601b03166129a7565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b61182188848360008d600281111561181b5761181b612a5c565b14611e1b565b50509695505050505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611863573d6000803e3d6000fd5b505050565b600080611895837f0000000000000000000000000000000000000000000000000000000000000000611e97565b91506118a083611ec6565b156118ad57506000915091565b6118ba8335836000610764565b156118c757506001915091565b506002915091565b60606000805a90506118e18686611eec565b61194957866118f861014088016101208901612161565b60405162fa072b60e01b815260048101929092526001600160a01b0316602482015260606044820152601060648201526f6e6f7420656e6f756768207374616b6560801b608482015260a401610645565b60006119598560a0890135612990565b905061196d61014088016101208901612161565b6001600160a01b03166380fd44d58289896040518463ffffffff1660e01b815260040161199b9291906127e6565b60006040518083038187803b1580156119b357600080fd5b5086fa935050505080156119e957506040513d6000823e601f3d908101601f191682016040526119e69190810190612293565b60015b611a91576119f5612a9e565b806308c379a01415611a445750611a0a612aba565b80611a155750611a46565b88611a286101408a016101208b01612161565b8260405162fa072b60e01b8152600401610645939291906127f9565b505b87611a5961014089016101208a01612161565b60405162fa072b60e01b815260048101929092526001600160a01b031660248201526060604482015260006064820152608401610645565b93505a611a9e9083612990565b9250505094509492505050565b60008060005a9050611abc86611f15565b4760006002866002811115611ad357611ad3612a5c565b1415611ae0575085611b04565b6001866002811115611af457611af4612a5c565b1415611b0457611b04888861209d565b6040516307dfd9cf60e51b81526001600160a01b038935169063fbfb39e09060a08b013590611b39908c9086906004016127e6565b600060405180830381600088803b158015611b5357600080fd5b5087f193505050508015611b65575060015b611be257611b71612a9e565b806308c379a01415611bb05750611b86612aba565b80611b915750611bb2565b8960008260405162fa072b60e01b8152600401610645939291906127f9565b505b60405162fa072b60e01b8152600481018a9052600060248201819052606060448301526064820152608401610645565b6000611bee8347612990565b90506002876002811115611c0457611c04612a5c565b1415611c705781811015611c685760405162fa072b60e01b8152600481018b90526000602482015260606044820152601960648201527f77616c6c6574206469646e2774207061792070726566756e6400000000000000608482015260a401610645565b809450611d5d565b6001876002811115611c8457611c84612a5c565b1415611cfd578015611cf55760405162fa072b60e01b8152600481018b90526000602482015260606044820152602660648201527f7573696e672077616c6c6574207374616b65206275742077616c6c65742070616084820152650d2c840cae8d60d31b60a482015260c401610645565b879450611d5d565b8015611d595760405162fa072b60e01b8152600481018b90526000602482015260606044820152601d60648201527f686173207061796d6173746572206275742077616c6c65742070616964000000608482015260a401610645565b8794505b5a611d689085612990565b95505050505094509492505050565b6000611d8e8260e0013548846101000135016120cf565b92915050565b6001600160a01b0382351660009081526020819052604081208054839290611dc69084906001600160601b031661294f565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050565b6040516000906001600160a01b038435169083156108fc0290849084818181858888f15050505050505050565b611e2d61014085016101208601612161565b6001600160a01b03168435604080516020808901358252810187905290810185905283151560608201526001600160a01b0391909116907fc27a60e61c14607957b41fa2dad696de47b2d80e390d0eaaf1514c0cd20342939060800160405180910390a350505050565b6000611ea283611d77565b611ebc83608086013560a08701350160c08701350161290f565b61081f9190612971565b600080611edb61014084016101208501612161565b6001600160a01b0316141592915050565b600061081f611f0361014085016101208601612161565b61027084670de0b6b3a764000061290f565b611f22604082018261283c565b15905061209a5760006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634af63f02611f67604085018561283c565b6040516001600160e01b031960e085901b168152611f8f929190602088013590600401612721565b602060405180830381600087803b158015611fa957600080fd5b505af1158015611fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe1919061217e565b90506001600160a01b03811661202a5760405162461bcd60e51b815260206004820152600e60248201526d18dc99585d194c8819985a5b195960921b6044820152606401610645565b81356001600160a01b0316816001600160a01b0316146120985760405162461bcd60e51b8152602060048201526024808201527f73656e64657220646f65736e2774206d617463682063726561746532206164646044820152637265737360e01b6064820152608401610645565b505b50565b6001600160a01b0382351660009081526020819052604081208054839290611dc69084906001600160601b03166129a7565b60008183106120de578161081f565b5090919050565b80356120f081612b61565b919050565b60008083601f84011261210757600080fd5b5081356001600160401b0381111561211e57600080fd5b6020830191508360208260051b8501011115610d6957600080fd5b8035600381106120f057600080fd5b6000610180828403121561215b57600080fd5b50919050565b60006020828403121561217357600080fd5b813561081f81612b61565b60006020828403121561219057600080fd5b815161081f81612b61565b600080604083850312156121ae57600080fd5b82356121b981612b61565b946020939093013593505050565b6000806000606084860312156121dc57600080fd5b83356121e781612b61565b95602085013595506040909401359392505050565b6000806020838503121561220f57600080fd5b82356001600160401b0381111561222557600080fd5b612231858286016120f5565b90969095509350505050565b60008060006040848603121561225257600080fd5b83356001600160401b0381111561226857600080fd5b612274868287016120f5565b909450925050602084013561228881612b61565b809150509250925092565b6000602082840312156122a557600080fd5b81516001600160401b038111156122bb57600080fd5b8201601f810184136122cc57600080fd5b80516122d7816128a3565b6040516122e482826129ff565b8281528660208486010111156122f957600080fd5b61230a8360208301602087016129cf565b9695505050505050565b6000806040838503121561232757600080fd5b82356001600160401b0381111561233d57600080fd5b8301601f8101851361234e57600080fd5b8035612359816128a3565b60405161236682826129ff565b82815287602084860101111561237b57600080fd5b8260208501602083013760006020938201840152979590910135955050505050565b6000602082840312156123af57600080fd5b81356001600160401b038111156123c557600080fd5b6123d184828501612148565b949350505050565b600080604083850312156123ec57600080fd5b82356001600160401b0381111561240257600080fd5b61240e85828601612148565b925050602083013561241f81612b61565b809150509250929050565b60008060008060008060a0878903121561244357600080fd5b86356001600160401b038082111561245a57600080fd5b6124668a838b01612148565b9750602089013591508082111561247c57600080fd5b818901915089601f83011261249057600080fd5b81358181111561249f57600080fd5b8a60208285010111156124b157600080fd5b60208301975080965050505060408701359250606087013591506124d760808801612139565b90509295509295509295565b600080604083850312156124f657600080fd5b82356001600160401b0381111561250c57600080fd5b61251885828601612148565b95602094909401359450505050565b60006020828403121561253957600080fd5b5051919050565b60006020828403121561255257600080fd5b813563ffffffff8116811461081f57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526125a78160208601602086016129cf565b601f01601f19169290920160200192915050565b60006101806125da846125cd856120e5565b6001600160a01b03169052565b602083013560208501526125f160408401846128ca565b8260408701526126048387018284612566565b9250505061261560608401846128ca565b8583036060870152612628838284612566565b925050506080830135608085015260a083013560a085015260c083013560c085015260e083013560e085015261010080840135818601525061012061266e8185016120e5565b6001600160a01b03169085015261014061268a848201856128ca565b8684038388015261269c848284612566565b93505050506101606126b0818501856128ca565b868403838801526126c2848284612566565b979650505050505050565b8183823760009101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015612715578351835292840192918401916001016126f9565b50909695505050505050565b604081526000612735604083018587612566565b9050826020830152949350505050565b604081526000612758604083018561258f565b90508260208301529392505050565b61277084612b43565b838152606060208201526000612789606083018561258f565b9050826040830152949350505050565b60a0815260006127ac60a08301886125bb565b82810360208401526127be818861258f565b9150508460408301528360608301526127d683612b43565b8260808301529695505050505050565b60408152600061275860408301856125bb565b8381526001600160a01b03831660208201526060604082018190526000906107e39083018461258f565b8281526040602082015260006123d1604083018461258f565b6000808335601e1984360301811261285357600080fd5b8301803591506001600160401b0382111561286d57600080fd5b602001915036819003821315610d6957600080fd5b6000823561017e1983360301811261289957600080fd5b9190910192915050565b60006001600160401b038211156128bc576128bc612a88565b50601f01601f191660200190565b6000808335601e198436030181126128e157600080fd5b83016020810192503590506001600160401b0381111561290057600080fd5b803603831315610d6957600080fd5b6000821982111561292257612922612a46565b500190565b600063ffffffff80831681851680830382111561294657612946612a46565b01949350505050565b60006001600160601b0380831681851680830382111561294657612946612a46565b600081600019048311821515161561298b5761298b612a46565b500290565b6000828210156129a2576129a2612a46565b500390565b60006001600160601b03838116908316818110156129c7576129c7612a46565b039392505050565b60005b838110156129ea5781810151838201526020016129d2565b838111156129f9576000848401525b50505050565b601f8201601f191681016001600160401b0381118282101715612a2457612a24612a88565b6040525050565b6000600019821415612a3f57612a3f612a46565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612ab75760046000803e5060005160e01c5b90565b600060443d1015612ac85790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612af757505050505090565b8285019150815181811115612b0f5750505050505090565b843d8701016020828501011115612b295750505050505090565b612b38602082860101876129ff565b509095945050505050565b6003811061209a57634e487b7160e01b600052602160045260246000fd5b6001600160a01b038116811461209a57600080fdfea26469706673582212207d15049d6b9c7e811e26d8092a0a93a7d0ccb320de507c9e54141a4480435a1c64736f6c63430008070033",
+ "deployedBytecode": "0x6080604052600436106101235760003560e01c8063af2ed7d7116100a0578063c345315311610064578063c345315314610446578063dbbabd6a1461053c578063e7c350e31461055c578063f20751eb146105a5578063f3737f19146105c657600080fd5b8063af2ed7d71461033a578063bb9fe6bf1461035a578063bf55512e1461036f578063c23a5cea1461038f578063c31e4354146103af57600080fd5b80632815c17b116100e75780632815c17b146102755780634a58db1914610295578063643407ce1461029d578063739b8950146102df578063828190131461030c57600080fd5b80630396cb601461012f5780630bfb68471461014457806316934fc4146101955780631c112a44146102255780631fa75c861461025557600080fd5b3661012a57005b600080fd5b61014261013d366004612540565b6105d9565b005b34801561015057600080fd5b506101787f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101a157600080fd5b506101ee6101b0366004612161565b6000602081905290815260409020546001600160601b038082169163ffffffff600160601b8204811692600160801b83041691600160e01b90041684565b604080516001600160601b03958616815263ffffffff9485166020820152949092169184019190915216606082015260800161018c565b34801561023157600080fd5b506102456102403660046121c7565b610764565b604051901515815260200161018c565b34801561026157600080fd5b5061024561027036600461219b565b6107ec565b34801561028157600080fd5b5061014261029036600461223d565b610826565b610142610c24565b3480156102a957600080fd5b506102d17f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161018c565b3480156102eb57600080fd5b506102ff6102fa3660046121fc565b610c30565b60405161018c91906126dd565b34801561031857600080fd5b5061032c6103273660046124e3565b610d09565b60405161018c929190612745565b34801561034657600080fd5b506102d161035536600461242a565b610d70565b34801561036657600080fd5b50610142610ee2565b34801561037b57600080fd5b506102d161038a36600461239d565b611055565b34801561039b57600080fd5b506101426103aa366004612161565b6110e0565b3480156103bb57600080fd5b506101786103ca366004612314565b8151602092830120604080516001600160f81b0319818601527f000000000000000000000000000000000000000000000000000000000000000060601b6bffffffffffffffffffffffff191660218201526035810193909352605580840192909252805180840390920182526075909201909152805191012090565b34801561045257600080fd5b506104eb610461366004612161565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b031660009081526020818152604091829020825160808101845290546001600160601b03808216835263ffffffff600160601b8304811694840194909452600160801b82041693820193909352600160e01b90920416606082015290565b60405161018c919060006080820190506001600160601b03808451168352602084015163ffffffff808216602086015282604087015116604086015280606087015116606086015250505092915050565b34801561054857600080fd5b506101426105573660046123d9565b611311565b34801561056857600080fd5b506105907f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161018c565b3480156105b157600080fd5b506102456105c0366004612161565b3f151590565b6101426105d4366004612161565b61142b565b3360009081526020819052604090205463ffffffff600160601b9091048116908216101561064e5760405162461bcd60e51b815260206004820152601e60248201527f63616e6e6f7420646563726561736520756e7374616b6520626c6f636b73000060448201526064015b60405180910390fd5b336000908152602081905260408120546001600160601b03600160801b820481169161067c9134911661290f565b610686919061290f565b604080516080810182526001600160601b0383811680835263ffffffff878116602080860182815260008789018181526060890182815233808452838652928b902099518a54945192519151908a166001600160801b031990951694909417600160601b92881692909202919091176001600160801b0316600160801b91909816026001600160e01b031696909617600160e01b91909416029290921790945584519182528101929092529293507f270d6dd254edd1d985c81cf7861b8f28fb06b6d719df04d90464034d4341244091015b60405180910390a25050565b6001600160a01b038316600090815260208181526040808320815160808101835290546001600160601b0380821680845263ffffffff600160601b8404811696850196909652600160801b830490911693830193909352600160e01b9004909216606083015284118015906107e3575082816020015163ffffffff1610155b95945050505050565b600061081f83837f000000000000000000000000000000000000000000000000000000000000000063ffffffff16610764565b9392505050565b816000816001600160401b0381111561084157610841612a88565b60405190808252806020026020018201604052801561086a578160200160208202803683370190505b5090506000826001600160401b0381111561088757610887612a88565b6040519080825280602002602001820160405280156108b0578160200160208202803683370190505b5090506000836001600160401b038111156108cd576108cd612a88565b6040519080825280602002602001820160405280156108f6578160200160208202803683370190505b5090506000846001600160401b0381111561091357610913612a88565b60405190808252806020026020018201604052801561093c578160200160208202803683370190505b50905060005b85811015610a735760005a9050368a8a8481811061096257610962612a72565b90506020028101906109749190612882565b9050606060006109848584611483565b89888151811061099657610996612a72565b602002602001018989815181106109af576109af612a72565b602002602001018296508360028111156109cb576109cb612a5c565b60028111156109dc576109dc612a5c565b81525083815250505050819050808886815181106109fc576109fc612a72565b6020026020010181815250507f00000000000000000000000000000000000000000000000000000000000000005a610a349086612990565b610a3e919061290f565b898681518110610a5057610a50612a72565b602002602001018181525050505050508080610a6b90612a2b565b915050610942565b506000805b88811015610c0e5760005a9050368b8b84818110610a9857610a98612a72565b9050602002810190610aaa9190612882565b90506000878481518110610ac057610ac0612a72565b60200260200101519050606081905060008a8681518110610ae357610ae3612a72565b602002602001015190506000898781518110610b0157610b01612a72565b602002602001015190506000898881518110610b1f57610b1f612a72565b60200260200101519050306001600160a01b031663af2ed7d787868686866040518663ffffffff1660e01b8152600401610b5d959493929190612799565b602060405180830381600087803b158015610b7757600080fd5b505af1925050508015610ba7575060408051601f3d908101601f19168201909252610ba491810190612527565b60015b610be6576000835a610bb9908a612990565b610bc3919061290f565b9050610bd460028887848787611589565b610bde908b61290f565b995050610bf4565b610bf0818b61290f565b9950505b505050505050508080610c0690612a2b565b915050610a78565b50610c19878261182d565b505050505050505050565b610c2e60006105d9565b565b6060816001600160401b03811115610c4a57610c4a612a88565b604051908082528060200260200182016040528015610c73578160200160208202803683370190505b50905060005b82811015610d0257600080858584818110610c9657610c96612a72565b9050602002016020810190610cab9190612161565b6001600160a01b0316815260208101919091526040016000205482516001600160601b0390911690839083908110610ce557610ce5612a72565b602090810291909101015280610cfa81612a2b565b915050610c79565b5092915050565b60606000806000610d1986611868565b90925090506000816002811115610d3257610d32612a5c565b14610d555760006040518060200160405280600081525090935093505050610d69565b610d6260008784886118cf565b9350935050505b9250929050565b6000805a9050333014610d8257600080fd5b600080610d9260608b018b61283c565b90501115610e74576000808a356001600160a01b031660808c0135610dba60608e018e61283c565b604051610dc89291906126cd565b60006040518083038160008787f1925050503d8060008114610e06576040519150601f19603f3d011682016040523d82523d6000602084013e610e0b565b606091505b509150915081158015610e1f575060008151115b15610e71578a356001600160a01b03167fbe4889eb241fb33bc0e9873f6e442f4c5dc653a55e7ad8bca2f001c9b3d818fb8c6020013583604051610e64929190612823565b60405180910390a2600192505b50505b6000865a610e829085612990565b610e8c919061290f565b9050610ed4828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792508c91508b9050611589565b9a9950505050505050505050565b3360009081526020819052604090208054600160e01b900463ffffffff1615610f3f5760405162461bcd60e51b815260206004820152600f60248201526e616c72656164792070656e64696e6760881b6044820152606401610645565b80546001600160601b031615801590610f6557508054600160601b900463ffffffff1615155b610fa65760405162461bcd60e51b81526020600482015260126024820152716e6f207374616b6520746f20756e6c6f636b60701b6044820152606401610645565b8054600090610fc290600160601b900463ffffffff1643612927565b82546001600160801b0381166bffffffffffffffffffffffff60801b19600160e01b63ffffffff8516908102918216929092176001600160601b039384169190931617600160801b02919091176bffffffffffffffffffffffff1916845560405190815290915033907fab3a43860ac8cdb29929ba1a1f556b4decf9617f4811c190010e1672e55839b190602001610758565b600033156110ba5760405162461bcd60e51b815260206004820152602c60248201527f6d7573742062652063616c6c6564206f66662d636861696e207769746820667260448201526b37b69ebd32b93796b0b2323960a11b6064820152608401610645565b6000806110c684611868565b915091506110d76000858484611aab565b50949350505050565b3360009081526020818152604091829020825160808101845290546001600160601b03808216835263ffffffff600160601b83048116948401859052600160801b830490911694830194909452600160e01b90049092166060830152156111e457600081604001516001600160601b0316116111925760405162461bcd60e51b81526020600482015260116024820152706e6f20756e6c6f636b6564207374616b6560781b6044820152606401610645565b43816060015163ffffffff1611156111e45760405162461bcd60e51b81526020600482015260156024820152745769746864726177616c206973206e6f742064756560581b6044820152606401610645565b805160408201516000916111f79161294f565b60408051608081018252600080825260208681015163ffffffff9081168285019081528486018481526060860185815233865293859052868520955186549251915194518416600160e01b026001600160e01b036001600160601b03968716600160801b02166001600160801b0393909516600160601b026001600160801b031990941691861691909117929092171691909117179092559151921692506001600160a01b0385169183156108fc0291849190818181858888f193505050501580156112c7573d6000803e3d6000fd5b50604080516001600160a01b03851681526020810183905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3910160405180910390a2505050565b60005a90506000806000611326600087611483565b92509250925060007f00000000000000000000000000000000000000000000000000000000000000005a61135a9087612990565b611364919061290f565b60405163af2ed7d760e01b8152909150600090309063af2ed7d790611395908b90879087908b908b90600401612799565b602060405180830381600087803b1580156113af57600080fd5b505af19250505080156113df575060408051601f3d908101601f191682019092526113dc91810190612527565b60015b611414576000825a6113f19089612990565b6113fb919061290f565b905061140c60028a86848a8a611589565b915050611417565b90505b611421878261182d565b5050505050505050565b6001600160a01b0381166000908152602081905260408120805434929061145c9084906001600160601b031661294f565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050565b600080606060005a905060008061149987611868565b955090506114a988888388611aab565b965091506000808660028111156114c2576114c2612a5c565b14156114de576114d4898984866118cf565b90955090506114f1565b6040518060200160405280600081525094505b60005a6114fe9086612990565b9050808960a00135101561157d578961151f6101408b016101208c01612161565b60405162fa072b60e01b815260048101929092526001600160a01b0316602482015260606044820152601e60648201527f55736564206d6f7265207468616e20766572696669636174696f6e4761730000608482015260a401610645565b50505050509250925092565b6000805a9050600061159a88611d77565b90506115a68187612971565b925060008460028111156115bc576115bc612a5c565b14611663578285101561161c5760405162461bcd60e51b815260206004820152602260248201527f77616c6c65742070726566756e642062656c6f772061637475616c476173436f6044820152611cdd60f21b6064820152608401610645565b60006116288487612990565b9050600185600281111561163e5761163e612a5c565b14156116535761164e8982611d94565b61165d565b61165d8982611dee565b50611801565b86511561176f5761167c61014089016101208a01612161565b6001600160a01b031663a9a234098a89866040518463ffffffff1660e01b81526004016116ab93929190612767565b600060405180830381600087803b1580156116c557600080fd5b505af19250505080156116d6575060015b61176f573d808015611704576040519150601f19603f3d011682016040523d82523d6000602084013e611709565b606091505b5061171c6101408a016101208b01612161565b6001600160a01b031689356001600160a01b03167f45197bfe91c32368fd75a4fcab42a1eff7699e79df0e171a343537be7657efb68b6020013584604051611765929190612823565b60405180910390a3505b5a61177a9083612990565b611784908761290f565b95506117908187612971565b9250826000806117a86101408c016101208d01612161565b6001600160a01b031681526020810191909152604001600090812080549091906117dc9084906001600160601b03166129a7565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b61182188848360008d600281111561181b5761181b612a5c565b14611e1b565b50509695505050505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611863573d6000803e3d6000fd5b505050565b600080611895837f0000000000000000000000000000000000000000000000000000000000000000611e97565b91506118a083611ec6565b156118ad57506000915091565b6118ba8335836000610764565b156118c757506001915091565b506002915091565b60606000805a90506118e18686611eec565b61194957866118f861014088016101208901612161565b60405162fa072b60e01b815260048101929092526001600160a01b0316602482015260606044820152601060648201526f6e6f7420656e6f756768207374616b6560801b608482015260a401610645565b60006119598560a0890135612990565b905061196d61014088016101208901612161565b6001600160a01b03166380fd44d58289896040518463ffffffff1660e01b815260040161199b9291906127e6565b60006040518083038187803b1580156119b357600080fd5b5086fa935050505080156119e957506040513d6000823e601f3d908101601f191682016040526119e69190810190612293565b60015b611a91576119f5612a9e565b806308c379a01415611a445750611a0a612aba565b80611a155750611a46565b88611a286101408a016101208b01612161565b8260405162fa072b60e01b8152600401610645939291906127f9565b505b87611a5961014089016101208a01612161565b60405162fa072b60e01b815260048101929092526001600160a01b031660248201526060604482015260006064820152608401610645565b93505a611a9e9083612990565b9250505094509492505050565b60008060005a9050611abc86611f15565b4760006002866002811115611ad357611ad3612a5c565b1415611ae0575085611b04565b6001866002811115611af457611af4612a5c565b1415611b0457611b04888861209d565b6040516307dfd9cf60e51b81526001600160a01b038935169063fbfb39e09060a08b013590611b39908c9086906004016127e6565b600060405180830381600088803b158015611b5357600080fd5b5087f193505050508015611b65575060015b611be257611b71612a9e565b806308c379a01415611bb05750611b86612aba565b80611b915750611bb2565b8960008260405162fa072b60e01b8152600401610645939291906127f9565b505b60405162fa072b60e01b8152600481018a9052600060248201819052606060448301526064820152608401610645565b6000611bee8347612990565b90506002876002811115611c0457611c04612a5c565b1415611c705781811015611c685760405162fa072b60e01b8152600481018b90526000602482015260606044820152601960648201527f77616c6c6574206469646e2774207061792070726566756e6400000000000000608482015260a401610645565b809450611d5d565b6001876002811115611c8457611c84612a5c565b1415611cfd578015611cf55760405162fa072b60e01b8152600481018b90526000602482015260606044820152602660648201527f7573696e672077616c6c6574207374616b65206275742077616c6c65742070616084820152650d2c840cae8d60d31b60a482015260c401610645565b879450611d5d565b8015611d595760405162fa072b60e01b8152600481018b90526000602482015260606044820152601d60648201527f686173207061796d6173746572206275742077616c6c65742070616964000000608482015260a401610645565b8794505b5a611d689085612990565b95505050505094509492505050565b6000611d8e8260e0013548846101000135016120cf565b92915050565b6001600160a01b0382351660009081526020819052604081208054839290611dc69084906001600160601b031661294f565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050565b6040516000906001600160a01b038435169083156108fc0290849084818181858888f15050505050505050565b611e2d61014085016101208601612161565b6001600160a01b03168435604080516020808901358252810187905290810185905283151560608201526001600160a01b0391909116907fc27a60e61c14607957b41fa2dad696de47b2d80e390d0eaaf1514c0cd20342939060800160405180910390a350505050565b6000611ea283611d77565b611ebc83608086013560a08701350160c08701350161290f565b61081f9190612971565b600080611edb61014084016101208501612161565b6001600160a01b0316141592915050565b600061081f611f0361014085016101208601612161565b61027084670de0b6b3a764000061290f565b611f22604082018261283c565b15905061209a5760006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634af63f02611f67604085018561283c565b6040516001600160e01b031960e085901b168152611f8f929190602088013590600401612721565b602060405180830381600087803b158015611fa957600080fd5b505af1158015611fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe1919061217e565b90506001600160a01b03811661202a5760405162461bcd60e51b815260206004820152600e60248201526d18dc99585d194c8819985a5b195960921b6044820152606401610645565b81356001600160a01b0316816001600160a01b0316146120985760405162461bcd60e51b8152602060048201526024808201527f73656e64657220646f65736e2774206d617463682063726561746532206164646044820152637265737360e01b6064820152608401610645565b505b50565b6001600160a01b0382351660009081526020819052604081208054839290611dc69084906001600160601b03166129a7565b60008183106120de578161081f565b5090919050565b80356120f081612b61565b919050565b60008083601f84011261210757600080fd5b5081356001600160401b0381111561211e57600080fd5b6020830191508360208260051b8501011115610d6957600080fd5b8035600381106120f057600080fd5b6000610180828403121561215b57600080fd5b50919050565b60006020828403121561217357600080fd5b813561081f81612b61565b60006020828403121561219057600080fd5b815161081f81612b61565b600080604083850312156121ae57600080fd5b82356121b981612b61565b946020939093013593505050565b6000806000606084860312156121dc57600080fd5b83356121e781612b61565b95602085013595506040909401359392505050565b6000806020838503121561220f57600080fd5b82356001600160401b0381111561222557600080fd5b612231858286016120f5565b90969095509350505050565b60008060006040848603121561225257600080fd5b83356001600160401b0381111561226857600080fd5b612274868287016120f5565b909450925050602084013561228881612b61565b809150509250925092565b6000602082840312156122a557600080fd5b81516001600160401b038111156122bb57600080fd5b8201601f810184136122cc57600080fd5b80516122d7816128a3565b6040516122e482826129ff565b8281528660208486010111156122f957600080fd5b61230a8360208301602087016129cf565b9695505050505050565b6000806040838503121561232757600080fd5b82356001600160401b0381111561233d57600080fd5b8301601f8101851361234e57600080fd5b8035612359816128a3565b60405161236682826129ff565b82815287602084860101111561237b57600080fd5b8260208501602083013760006020938201840152979590910135955050505050565b6000602082840312156123af57600080fd5b81356001600160401b038111156123c557600080fd5b6123d184828501612148565b949350505050565b600080604083850312156123ec57600080fd5b82356001600160401b0381111561240257600080fd5b61240e85828601612148565b925050602083013561241f81612b61565b809150509250929050565b60008060008060008060a0878903121561244357600080fd5b86356001600160401b038082111561245a57600080fd5b6124668a838b01612148565b9750602089013591508082111561247c57600080fd5b818901915089601f83011261249057600080fd5b81358181111561249f57600080fd5b8a60208285010111156124b157600080fd5b60208301975080965050505060408701359250606087013591506124d760808801612139565b90509295509295509295565b600080604083850312156124f657600080fd5b82356001600160401b0381111561250c57600080fd5b61251885828601612148565b95602094909401359450505050565b60006020828403121561253957600080fd5b5051919050565b60006020828403121561255257600080fd5b813563ffffffff8116811461081f57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526125a78160208601602086016129cf565b601f01601f19169290920160200192915050565b60006101806125da846125cd856120e5565b6001600160a01b03169052565b602083013560208501526125f160408401846128ca565b8260408701526126048387018284612566565b9250505061261560608401846128ca565b8583036060870152612628838284612566565b925050506080830135608085015260a083013560a085015260c083013560c085015260e083013560e085015261010080840135818601525061012061266e8185016120e5565b6001600160a01b03169085015261014061268a848201856128ca565b8684038388015261269c848284612566565b93505050506101606126b0818501856128ca565b868403838801526126c2848284612566565b979650505050505050565b8183823760009101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015612715578351835292840192918401916001016126f9565b50909695505050505050565b604081526000612735604083018587612566565b9050826020830152949350505050565b604081526000612758604083018561258f565b90508260208301529392505050565b61277084612b43565b838152606060208201526000612789606083018561258f565b9050826040830152949350505050565b60a0815260006127ac60a08301886125bb565b82810360208401526127be818861258f565b9150508460408301528360608301526127d683612b43565b8260808301529695505050505050565b60408152600061275860408301856125bb565b8381526001600160a01b03831660208201526060604082018190526000906107e39083018461258f565b8281526040602082015260006123d1604083018461258f565b6000808335601e1984360301811261285357600080fd5b8301803591506001600160401b0382111561286d57600080fd5b602001915036819003821315610d6957600080fd5b6000823561017e1983360301811261289957600080fd5b9190910192915050565b60006001600160401b038211156128bc576128bc612a88565b50601f01601f191660200190565b6000808335601e198436030181126128e157600080fd5b83016020810192503590506001600160401b0381111561290057600080fd5b803603831315610d6957600080fd5b6000821982111561292257612922612a46565b500190565b600063ffffffff80831681851680830382111561294657612946612a46565b01949350505050565b60006001600160601b0380831681851680830382111561294657612946612a46565b600081600019048311821515161561298b5761298b612a46565b500290565b6000828210156129a2576129a2612a46565b500390565b60006001600160601b03838116908316818110156129c7576129c7612a46565b039392505050565b60005b838110156129ea5781810151838201526020016129d2565b838111156129f9576000848401525b50505050565b601f8201601f191681016001600160401b0381118282101715612a2457612a24612a88565b6040525050565b6000600019821415612a3f57612a3f612a46565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612ab75760046000803e5060005160e01c5b90565b600060443d1015612ac85790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612af757505050505090565b8285019150815181811115612b0f5750505050505090565b843d8701016020828501011115612b295750505050505090565b612b38602082860101876129ff565b509095945050505050565b6003811061209a57634e487b7160e01b600052602160045260246000fd5b6001600160a01b038116811461209a57600080fdfea26469706673582212207d15049d6b9c7e811e26d8092a0a93a7d0ccb320de507c9e54141a4480435a1c64736f6c63430008070033",
+ "devdoc": {
+ "kind": "dev",
+ "methods": {
+ "handleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes),address)": {
+ "params": {
+ "op": "the operation to execute",
+ "redeemer": "the contract to redeem the fee"
+ }
+ },
+ "simulatePaymasterValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes),uint256)": {
+ "params": {
+ "gasUsedByPayForSelfOp": "- the gas returned by simulateWalletValidation, as these 2 calls should share the same userOp.validationGas quota. The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the paymaster's data",
+ "userOp": "the user operation to validate."
+ }
+ },
+ "simulateWalletValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes))": {
+ "returns": {
+ "gasUsedByPayForSelfOp": "- gas used by the validation, to pass into simulatePaymasterValidation. The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the wallet's data"
+ }
+ }
+ },
+ "version": 1
+ },
+ "userdoc": {
+ "events": {
+ "StakeUnlocking(address,uint256)": {
+ "notice": "Emitted once a stake is scheduled for withdrawal"
+ }
+ },
+ "kind": "user",
+ "methods": {
+ "addDeposit()": {
+ "notice": "add a deposit (just like stake, but with lock=0 cancel any pending unlock"
+ },
+ "addStake(uint32)": {
+ "notice": "add stake value for this paymaster. cancel any pending unlock"
+ },
+ "handleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes),address)": {
+ "notice": "Execute the given UserOperation."
+ },
+ "simulatePaymasterValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes),uint256)": {
+ "notice": "Simulate a call to paymaster.verifyPaymasterUserOp do nothing if has no paymaster."
+ },
+ "simulateWalletValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,address,bytes,bytes))": {
+ "notice": "Simulate a call for wallet.verifyUserOp. Call must not revert."
+ },
+ "stakes(address)": {
+ "notice": "maps relay managers to their stakes"
+ },
+ "unstakeDelayBlocks()": {
+ "notice": "minimum number of blocks to after 'unlock' before amount can be withdrawn."
+ }
+ },
+ "version": 1
+ },
+ "storageLayout": {
+ "storage": [
+ {
+ "astId": 2325,
+ "contract": "contracts/EntryPoint.sol:EntryPoint",
+ "label": "stakes",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_address,t_struct(StakeInfo)2319_storage)"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "encoding": "inplace",
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_struct(StakeInfo)2319_storage)": {
+ "encoding": "mapping",
+ "key": "t_address",
+ "label": "mapping(address => struct StakeManager.StakeInfo)",
+ "numberOfBytes": "32",
+ "value": "t_struct(StakeInfo)2319_storage"
+ },
+ "t_struct(StakeInfo)2319_storage": {
+ "encoding": "inplace",
+ "label": "struct StakeManager.StakeInfo",
+ "members": [
+ {
+ "astId": 2312,
+ "contract": "contracts/EntryPoint.sol:EntryPoint",
+ "label": "stake",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint96"
+ },
+ {
+ "astId": 2314,
+ "contract": "contracts/EntryPoint.sol:EntryPoint",
+ "label": "unstakeDelayBlocks",
+ "offset": 12,
+ "slot": "0",
+ "type": "t_uint32"
+ },
+ {
+ "astId": 2316,
+ "contract": "contracts/EntryPoint.sol:EntryPoint",
+ "label": "withdrawStake",
+ "offset": 16,
+ "slot": "0",
+ "type": "t_uint96"
+ },
+ {
+ "astId": 2318,
+ "contract": "contracts/EntryPoint.sol:EntryPoint",
+ "label": "withdrawBlock",
+ "offset": 28,
+ "slot": "0",
+ "type": "t_uint32"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "encoding": "inplace",
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint96": {
+ "encoding": "inplace",
+ "label": "uint96",
+ "numberOfBytes": "12"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/SimpleWallet.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/SimpleWallet.json
new file mode 100644
index 000000000..6b14b548f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/SimpleWallet.json
@@ -0,0 +1,338 @@
+{
+ "address": "0x16d53bCF7d1614D0fF81559abB94bfBC7d3B84D9",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "contract EntryPoint",
+ "name": "_entryPoint",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "contract EntryPoint",
+ "name": "oldEntryPoint",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "contract EntryPoint",
+ "name": "newEntryPoint",
+ "type": "address"
+ }
+ ],
+ "name": "EntryPointChanged",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "addDeposit",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "entryPoint",
+ "outputs": [
+ {
+ "internalType": "contract EntryPoint",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "dest",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "func",
+ "type": "bytes"
+ }
+ ],
+ "name": "exec",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "dest",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "func",
+ "type": "bytes"
+ }
+ ],
+ "name": "execFromEntryPoint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "nonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "dest",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "contract EntryPoint",
+ "name": "_entryPoint",
+ "type": "address"
+ }
+ ],
+ "name": "updateEntryPoint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "uint256",
+ "name": "requiredPrefund",
+ "type": "uint256"
+ }
+ ],
+ "name": "verifyUserOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawDeposit",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [
+ "0xF63621e54F16eC6e4A732e44EaA7708935f259eF",
+ "0xd21934eD8eAf27a67f0A70042Af50A1D6d195E81"
+ ],
+ "solcInputHash": "9255faacf3ae4e81db1326413027bfa0",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract EntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract EntryPoint\",\"name\":\"oldEntryPoint\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract EntryPoint\",\"name\":\"newEntryPoint\",\"type\":\"address\"}],\"name\":\"EntryPointChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract EntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"func\",\"type\":\"bytes\"}],\"name\":\"exec\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"func\",\"type\":\"bytes\"}],\"name\":\"execFromEntryPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"dest\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract EntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"name\":\"updateEntryPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"requiredPrefund\",\"type\":\"uint256\"}],\"name\":\"verifyUserOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/SimpleWallet.sol\":\"SimpleWallet\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/EntryPoint.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"./StakeManager.sol\\\";\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IWallet.sol\\\";\\nimport \\\"./IPaymaster.sol\\\";\\n\\ninterface ICreate2Deployer {\\n function deploy(bytes memory _initCode, bytes32 _salt) external returns (address);\\n}\\n\\ncontract EntryPoint is StakeManager {\\n\\n using UserOperationLib for UserOperation;\\n // paymaster locked stake\\n // (actual stake should be higher, to cover actual call cost)\\n uint256 constant PAYMASTER_STAKE = 1 ether;\\n\\n enum PaymentMode {\\n paymasterStake, // if paymaster is set, use paymaster's stake to pay.\\n walletStake, // wallet has enough stake to pay for request.\\n walletEth // wallet has no stake. paying with eth.\\n }\\n\\n uint public immutable perOpOverhead;\\n address public immutable create2factory;\\n\\n event UserOperationEvent(address indexed sender, address indexed paymaster, uint nonce, uint actualGasCost, uint actualGasPrice, bool success);\\n event UserOperationRevertReason(address indexed sender, uint nonce, bytes revertReason);\\n\\n event PaymasterPostOpFailed(address indexed sender, address indexed paymaster, uint nonce, bytes reason);\\n\\n //handleOps reverts with this error struct, to mark the offending op\\n // NOTE: if simulateOp passes successfully, there should be no reason for handleOps to fail on it.\\n // @param opIndex - index into the array of ops to the failed one (in simulateOp, this is always zero)\\n // @param paymaster - if paymaster.verifyPaymasterUserOp fails, this will be the paymaster's address. if verifyUserOp failed,\\n // this value will be zero (since it failed before accessing the paymaster)\\n // @param reason - revert reason\\n // only to aid troubleshooting of wallet/paymaster reverts\\n error FailedOp(uint opIndex, address paymaster, string reason);\\n\\n constructor(address _create2factory, uint _perOpOverhead, uint32 _unstakeDelayBlocks) StakeManager(_unstakeDelayBlocks) {\\n create2factory = _create2factory;\\n perOpOverhead = _perOpOverhead;\\n }\\n\\n receive() external payable {}\\n\\n /**\\n * Execute the given UserOperation.\\n * @param op the operation to execute\\n * @param redeemer the contract to redeem the fee\\n */\\n function handleOp(UserOperation calldata op, address payable redeemer) public {\\n\\n uint preGas = gasleft();\\n\\n (uint256 prefund, PaymentMode paymentMode, bytes memory context) = _validatePrepayment(0, op);\\n uint preOpGas = preGas - gasleft() + perOpOverhead;\\n\\n uint actualGasCost;\\n\\n try this.internalHandleOp(op, context, preOpGas, prefund, paymentMode) returns (uint _actualGasCost) {\\n actualGasCost = _actualGasCost;\\n } catch {\\n uint actualGas = preGas - gasleft() + preOpGas;\\n actualGasCost = handlePostOp(IPaymaster.PostOpMode.postOpReverted, op, context, actualGas, prefund, paymentMode);\\n }\\n\\n redeem(redeemer, actualGasCost);\\n }\\n\\n function redeem(address payable redeemer, uint amount) internal {\\n redeemer.transfer(amount);\\n }\\n\\n function handleOps(UserOperation[] calldata ops, address payable redeemer) public {\\n\\n uint opslen = ops.length;\\n uint256[] memory preOpGas = new uint256[](opslen);\\n bytes32[] memory contexts = new bytes32[](opslen);\\n uint256[] memory prefunds = new uint256[](opslen);\\n PaymentMode[] memory paymentModes = new PaymentMode[](opslen);\\n\\n for (uint i = 0; i < opslen; i++) {\\n uint preGas = gasleft();\\n UserOperation calldata op = ops[i];\\n\\n bytes memory context;\\n bytes32 contextOffset;\\n (prefunds[i], paymentModes[i], context) = _validatePrepayment(i, op);\\n assembly {contextOffset := context}\\n contexts[i] = contextOffset;\\n preOpGas[i] = preGas - gasleft() + perOpOverhead;\\n }\\n\\n uint collected = 0;\\n\\n for (uint i = 0; i < ops.length; i++) {\\n uint preGas = gasleft();\\n UserOperation calldata op = ops[i];\\n bytes32 contextOffset = contexts[i];\\n bytes memory context;\\n assembly {context := contextOffset}\\n uint preOpGasi = preOpGas[i];\\n uint prefundi = prefunds[i];\\n PaymentMode paymentModei = paymentModes[i];\\n\\n try this.internalHandleOp(op, context, preOpGasi, prefundi, paymentModei) returns (uint _actualGasCost) {\\n collected += _actualGasCost;\\n } catch {\\n uint actualGas = preGas - gasleft() + preOpGasi;\\n collected += handlePostOp(IPaymaster.PostOpMode.postOpReverted, op, context, actualGas, prefundi, paymentModei);\\n }\\n }\\n\\n redeem(redeemer, collected);\\n }\\n\\n function internalHandleOp(UserOperation calldata op, bytes calldata context, uint preOpGas, uint prefund, PaymentMode paymentMode) external returns (uint actualGasCost) {\\n uint preGas = gasleft();\\n require(msg.sender == address(this));\\n\\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\\n if (op.callData.length > 0) {\\n\\n (bool success,bytes memory result) = address(op.getSender()).call{gas : op.callGas}(op.callData);\\n if (!success && result.length > 0) {\\n emit UserOperationRevertReason(op.getSender(), op.nonce, result);\\n mode = IPaymaster.PostOpMode.opReverted;\\n }\\n }\\n\\n uint actualGas = preGas - gasleft() + preOpGas;\\n return handlePostOp(mode, op, context, actualGas, prefund, paymentMode);\\n }\\n\\n /**\\n * Simulate a call for wallet.verifyUserOp.\\n * Call must not revert.\\n * @return gasUsedByPayForSelfOp - gas used by the validation, to pass into simulatePaymasterValidation.\\n * The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the wallet's data\\n */\\n function simulateWalletValidation(UserOperation calldata userOp) external returns (uint gasUsedByPayForSelfOp){\\n require(msg.sender == address(0), \\\"must be called off-chain with from=zero-addr\\\");\\n (uint requiredPreFund, PaymentMode paymentMode) = getPaymentInfo(userOp);\\n (gasUsedByPayForSelfOp,) = _validateWalletPrepayment(0, userOp, requiredPreFund, paymentMode);\\n }\\n\\n function getPaymentInfo(UserOperation calldata userOp) internal view returns (uint requiredPrefund, PaymentMode paymentMode) {\\n requiredPrefund = userOp.requiredPreFund(perOpOverhead);\\n if (userOp.hasPaymaster()) {\\n paymentMode = PaymentMode.paymasterStake;\\n } else if (isStaked(userOp.getSender(), requiredPrefund, 0)) {\\n paymentMode = PaymentMode.walletStake;\\n } else {\\n paymentMode = PaymentMode.walletEth;\\n }\\n }\\n\\n /**\\n * Simulate a call to paymaster.verifyPaymasterUserOp\\n * do nothing if has no paymaster.\\n * @param userOp the user operation to validate.\\n * @param gasUsedByPayForSelfOp - the gas returned by simulateWalletValidation, as these 2 calls should share\\n * the same userOp.validationGas quota.\\n * The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the paymaster's data\\n */\\n function simulatePaymasterValidation(UserOperation calldata userOp, uint gasUsedByPayForSelfOp) external view returns (bytes memory context, uint gasUsedByPayForOp){\\n (uint requiredPreFund, PaymentMode paymentMode) = getPaymentInfo(userOp);\\n if (paymentMode != PaymentMode.paymasterStake) {\\n return (\\\"\\\", 0);\\n }\\n return _validatePaymasterPrepayment(0, userOp, requiredPreFund, gasUsedByPayForSelfOp);\\n }\\n\\n // get the sender address, or use \\\"create2\\\" to create it.\\n // note that the gas allocation for this creation is deterministic (by the size of callData),\\n // so it is not checked on-chain, and adds to the gas used by verifyUserOp\\n function _createSenderIfNeeded(UserOperation calldata op) internal {\\n if (op.initCode.length != 0) {\\n //its a create operation. run the create2\\n // note that we're still under the gas limit of validate, so probably\\n // this create2 creates a proxy account.\\n // appending signer makes the request unique, so no one else can make this request.\\n //nonce is meaningless during create, so we re-purpose it as salt\\n address sender1 = ICreate2Deployer(create2factory).deploy(op.initCode, bytes32(op.nonce));\\n require(sender1 != address(0), \\\"create2 failed\\\");\\n require(sender1 == op.getSender(), \\\"sender doesn't match create2 address\\\");\\n }\\n }\\n\\n //get counterfactual sender address.\\n // use the initCode and salt in the UserOperation tot create this sender contract\\n function getSenderAddress(bytes memory initCode, uint _salt) public view returns (address) {\\n bytes32 hash = keccak256(\\n abi.encodePacked(\\n bytes1(0xff),\\n address(create2factory),\\n _salt,\\n keccak256(initCode)\\n )\\n );\\n\\n // NOTE: cast last 20 bytes of hash to address\\n return address(uint160(uint256(hash)));\\n }\\n\\n //call wallet.verifyUserOp, and validate that it paid as needed.\\n // return actual value sent from wallet to \\\"this\\\"\\n function _validateWalletPrepayment(uint opIndex, UserOperation calldata op, uint requiredPrefund, PaymentMode paymentMode) internal returns (uint gasUsedByPayForSelfOp, uint prefund) {\\n uint preGas = gasleft();\\n _createSenderIfNeeded(op);\\n uint preBalance = address(this).balance;\\n uint requiredEthPrefund = 0;\\n if (paymentMode == PaymentMode.walletEth) {\\n requiredEthPrefund = requiredPrefund;\\n } else if (paymentMode == PaymentMode.walletStake) {\\n _prefundFromSender(op, requiredPrefund);\\n } else {\\n // paymaster pays in handlePostOp\\n }\\n try IWallet(op.getSender()).verifyUserOp{gas : op.verificationGas}(op, requiredEthPrefund) {\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, address(0), revertReason);\\n } catch {\\n revert FailedOp(opIndex, address(0), \\\"\\\");\\n }\\n uint actualEthPrefund = address(this).balance - preBalance;\\n\\n if (paymentMode == PaymentMode.walletEth) {\\n if (actualEthPrefund < requiredEthPrefund) {\\n revert FailedOp(opIndex, address(0), \\\"wallet didn't pay prefund\\\");\\n }\\n prefund = actualEthPrefund;\\n } else if (paymentMode == PaymentMode.walletStake) {\\n if (actualEthPrefund != 0) {\\n revert FailedOp(opIndex, address(0), \\\"using wallet stake but wallet paid eth\\\");\\n }\\n prefund = requiredPrefund;\\n } else {\\n if (actualEthPrefund != 0) {\\n revert FailedOp(opIndex, address(0), \\\"has paymaster but wallet paid\\\");\\n }\\n prefund = requiredPrefund;\\n }\\n\\n gasUsedByPayForSelfOp = preGas - gasleft();\\n }\\n\\n //validate paymaster.verifyPaymasterUserOp\\n function _validatePaymasterPrepayment(uint opIndex, UserOperation calldata op, uint requiredPreFund, uint gasUsedByPayForSelfOp) internal view returns (bytes memory context, uint gasUsedByPayForOp) {\\n uint preGas = gasleft();\\n if (!isValidStake(op, requiredPreFund)) {\\n revert FailedOp(opIndex, op.paymaster, \\\"not enough stake\\\");\\n }\\n //no pre-pay from paymaster\\n uint gas = op.verificationGas - gasUsedByPayForSelfOp;\\n try IPaymaster(op.paymaster).verifyPaymasterUserOp{gas : gas}(op, requiredPreFund) returns (bytes memory _context){\\n context = _context;\\n } catch Error(string memory revertReason) {\\n revert FailedOp(opIndex, op.paymaster, revertReason);\\n } catch {\\n revert FailedOp(opIndex, op.paymaster, \\\"\\\");\\n }\\n gasUsedByPayForOp = preGas - gasleft();\\n }\\n\\n function _validatePrepayment(uint opIndex, UserOperation calldata userOp) private returns (uint prefund, PaymentMode paymentMode, bytes memory context){\\n\\n uint preGas = gasleft();\\n uint gasUsedByPayForSelfOp;\\n uint requiredPreFund;\\n (requiredPreFund, paymentMode) = getPaymentInfo(userOp);\\n\\n (gasUsedByPayForSelfOp, prefund) = _validateWalletPrepayment(opIndex, userOp, requiredPreFund, paymentMode);\\n\\n uint gasUsedByPayForOp = 0;\\n if (paymentMode == PaymentMode.paymasterStake) {\\n (context, gasUsedByPayForOp) = _validatePaymasterPrepayment(opIndex, userOp, requiredPreFund, gasUsedByPayForSelfOp);\\n } else {\\n context = \\\"\\\";\\n }\\n uint gasUsed = preGas - gasleft();\\n\\n if (userOp.verificationGas < gasUsed) {\\n revert FailedOp(opIndex, userOp.paymaster, \\\"Used more than verificationGas\\\");\\n }\\n }\\n\\n function getPaymastersStake(address[] calldata paymasters) external view returns (uint[] memory _stakes) {\\n _stakes = new uint[](paymasters.length);\\n for (uint i = 0; i < paymasters.length; i++) {\\n _stakes[i] = stakes[paymasters[i]].stake;\\n }\\n }\\n\\n function handlePostOp(IPaymaster.PostOpMode mode, UserOperation calldata op, bytes memory context, uint actualGas, uint prefund, PaymentMode paymentMode) private returns (uint actualGasCost) {\\n uint preGas = gasleft();\\n uint gasPrice = UserOperationLib.gasPrice(op);\\n actualGasCost = actualGas * gasPrice;\\n if (paymentMode != PaymentMode.paymasterStake) {\\n if (prefund < actualGasCost) {\\n revert (\\\"wallet prefund below actualGasCost\\\");\\n }\\n uint refund = prefund - actualGasCost;\\n if (paymentMode == PaymentMode.walletStake) {\\n _refundSenderStake(op, refund);\\n } else {\\n _refundSender(op, refund);\\n }\\n } else {\\n if (context.length > 0) {\\n //if paymaster.postOp reverts:\\n // - emit a message (just for sake of debugging of this poor paymaster)\\n // - paymaster still pays (from its stake)\\n try IPaymaster(op.paymaster).postOp(mode, context, actualGasCost) {}\\n catch (bytes memory errdata) {\\n emit PaymasterPostOpFailed(op.getSender(), op.paymaster, op.nonce, errdata);\\n }\\n }\\n //paymaster pays for full gas, including for postOp (and revert event)\\n actualGas += preGas - gasleft();\\n actualGasCost = actualGas * gasPrice;\\n //paymaster balance known to be high enough, and to be locked for this block\\n stakes[op.paymaster].stake -= uint96(actualGasCost);\\n }\\n _emitLog(op, actualGasCost, gasPrice, mode == IPaymaster.PostOpMode.opSucceeded);\\n }\\n\\n function _emitLog(UserOperation calldata op, uint actualGasCost, uint gasPrice, bool success) internal {\\n emit UserOperationEvent(op.getSender(), op.paymaster, op.nonce, actualGasCost, gasPrice, success);\\n }\\n\\n function _prefundFromSender(UserOperation calldata userOp, uint requiredPrefund) internal {\\n stakes[userOp.getSender()].stake -= uint96(requiredPrefund);\\n }\\n\\n function _refundSender(UserOperation calldata userOp, uint refund) internal {\\n //NOTE: deliberately ignoring revert: wallet should accept refund.\\n bool sendOk = payable(userOp.getSender()).send(refund);\\n (sendOk);\\n }\\n function _refundSenderStake(UserOperation calldata userOp, uint refund) internal {\\n stakes[userOp.getSender()].stake += uint96(refund);\\n }\\n\\n function isValidStake(UserOperation calldata userOp, uint requiredPreFund) internal view returns (bool) {\\n return isPaymasterStaked(userOp.paymaster, PAYMASTER_STAKE + requiredPreFund);\\n }\\n\\n function isPaymasterStaked(address paymaster, uint stake) public view returns (bool) {\\n return isStaked(paymaster, stake, unstakeDelayBlocks);\\n }\\n\\n function isContractDeployed(address addr) external view returns (bool) {\\n bytes32 hash;\\n assembly {\\n hash := extcodehash(addr)\\n }\\n return hash != bytes32(0);\\n }\\n}\\n\\n\",\"keccak256\":\"0x8b15a6fcb66f95fc079400ff2b38de805405ce6c23c4bbbc1bcd24bb6cabefb0\",\"license\":\"GPL-3.0\"},\"contracts/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IPaymaster {\\n\\n enum PostOpMode {\\n opSucceeded, // user op succeeded\\n opReverted, // user op reverted. still has to pay for gas.\\n postOpReverted //user op succeeded, but caused postOp to revert. Now its a 2nd call, after user's op was deliberately reverted.\\n }\\n // payment validation: check if paymaster agree to pay (using its stake)\\n // revert to reject this request.\\n // actual payment is done after postOp is called, by deducting actual call cost form the paymaster's stake.\\n // @param userOp the user operation\\n // @param maxcost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\\n // @returns context value to send to a postOp\\n // zero length to signify postOp is not required.\\n function verifyPaymasterUserOp(UserOperation calldata userOp, uint maxcost) external view returns (bytes memory context);\\n\\n // post-operation handler.\\n // @param mode\\n // opSucceeded - user operation succeeded.\\n // opReverted - user op reverted. still has to pay for gas.\\n // postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\\n // Now this is the 2nd call, after user's op was deliberately reverted.\\n // @param context - the context value returned by verifyPaymasterUserOp\\n // @param actualGasCost - actual gas used so far (without this postOp call).\\n function postOp(PostOpMode mode, bytes calldata context, uint actualGasCost) external;\\n}\\n\",\"keccak256\":\"0xef51907c5520d22e74cc7804b30634cdc6d2cbf2fe96b77d0b6785a53c4545a5\",\"license\":\"GPL-3.0\"},\"contracts/IWallet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IWallet {\\n\\n // validate user's signature and nonce\\n // @param requiredPrefund how much this wallet should pre-fund the transaction.\\n // @note that after execution, the excess is sent back to the wallet.\\n // @note if requiredPrefund is zero, the wallet MUST NOT send anything (the paymaster pays)\\n function verifyUserOp(UserOperation calldata userOp, uint requiredPrefund) external;\\n}\\n\",\"keccak256\":\"0x29f98a4e6033cd10007dcc9b569fda950413cc91d8560a67f20a35e8185c9228\",\"license\":\"GPL-3.0\"},\"contracts/StakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8;\\n\\nimport \\\"hardhat/console.sol\\\";\\n\\ncontract StakeManager {\\n\\n /// minimum number of blocks to after 'unlock' before amount can be withdrawn.\\n uint32 immutable public unstakeDelayBlocks;\\n\\n constructor(uint32 _unstakeDelayBlocks) {\\n unstakeDelayBlocks = _unstakeDelayBlocks;\\n }\\n\\n event StakeAdded(\\n address indexed paymaster,\\n uint256 totalStake,\\n uint256 unstakeDelayBlocks\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocking(\\n address indexed paymaster,\\n uint256 withdrawBlock\\n );\\n\\n event StakeWithdrawn(\\n address indexed paymaster,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// @param stake - amount of ether staked for this paymaster\\n /// @param withdrawStake - once 'unlocked' the value is no longer staked.\\n /// @param withdrawBlock - first block number 'withdraw' will be callable, or zero if the unlock has not been called\\n struct StakeInfo {\\n uint96 stake;\\n uint32 unstakeDelayBlocks;\\n uint96 withdrawStake;\\n uint32 withdrawBlock;\\n }\\n\\n /// maps relay managers to their stakes\\n mapping(address => StakeInfo) public stakes;\\n\\n function getStakeInfo(address paymaster) external view returns (StakeInfo memory stakeInfo) {\\n return stakes[paymaster];\\n }\\n\\n /**\\n * add a deposit (just like stake, but with lock=0\\n * cancel any pending unlock\\n */\\n function addDeposit() external payable {\\n addStake(0);\\n }\\n\\n //add deposit to another account (doesn't change lock status)\\n function addDepositTo(address target) external payable {\\n stakes[target].stake += uint96(msg.value);\\n }\\n\\n /**\\n * add stake value for this paymaster.\\n * cancel any pending unlock\\n */\\n function addStake(uint32 _unstakeDelayBlocks) public payable {\\n require(_unstakeDelayBlocks >= stakes[msg.sender].unstakeDelayBlocks, \\\"cannot decrease unstake blocks\\\");\\n uint96 stake = uint96(stakes[msg.sender].stake + msg.value + stakes[msg.sender].withdrawStake);\\n stakes[msg.sender] = StakeInfo(\\n stake,\\n _unstakeDelayBlocks,\\n 0,\\n 0);\\n emit StakeAdded(msg.sender, stake, _unstakeDelayBlocks);\\n }\\n\\n function unlockStake() external {\\n StakeInfo storage info = stakes[msg.sender];\\n require(info.withdrawBlock == 0, \\\"already pending\\\");\\n require(info.stake != 0 && info.unstakeDelayBlocks != 0, \\\"no stake to unlock\\\");\\n uint32 withdrawBlock = uint32(block.number) + info.unstakeDelayBlocks;\\n info.withdrawBlock = withdrawBlock;\\n info.withdrawStake = info.stake;\\n info.stake = 0;\\n emit StakeUnlocking(msg.sender, withdrawBlock);\\n }\\n\\n function withdrawStake(address payable withdrawAddress) external {\\n StakeInfo memory info = stakes[msg.sender];\\n if (info.unstakeDelayBlocks != 0) {\\n require(info.withdrawStake > 0, \\\"no unlocked stake\\\");\\n require(info.withdrawBlock <= block.number, \\\"Withdrawal is not due\\\");\\n }\\n uint256 amount = info.withdrawStake + info.stake;\\n stakes[msg.sender] = StakeInfo(0, info.unstakeDelayBlocks, 0, 0);\\n withdrawAddress.transfer(amount);\\n emit StakeWithdrawn(msg.sender, withdrawAddress, amount);\\n }\\n\\n function isStaked(address paymaster, uint requiredStake, uint requiredDelayBlocks) public view returns (bool) {\\n StakeInfo memory stakeInfo = stakes[paymaster];\\n return stakeInfo.stake >= requiredStake && stakeInfo.unstakeDelayBlocks >= requiredDelayBlocks;\\n }\\n}\\n\",\"keccak256\":\"0x238f903aceaaa89fd289d99c16ff660b6f911837f50ccf3fc3bb94653024b1aa\",\"license\":\"GPL-3.0-only\"},\"contracts/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"hardhat/console.sol\\\";\\n\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint callGas;\\n uint verificationGas;\\n uint preVerificationGas;\\n uint maxFeePerGas;\\n uint maxPriorityFeePerGas;\\n address paymaster;\\n bytes paymasterData;\\n bytes signature;\\n }\\n\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal view returns (address ret) {\\n assembly {ret := calldataload(userOp)}\\n }\\n\\n //relayer/miner might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint) {\\n unchecked {\\n return min(userOp.maxFeePerGas, userOp.maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function requiredGas(UserOperation calldata userOp) internal pure returns (uint) {\\n unchecked {\\n return userOp.callGas + userOp.verificationGas + userOp.preVerificationGas;\\n }\\n }\\n\\n function requiredPreFund(UserOperation calldata userOp, uint overhead) internal view returns (uint prefund) {\\n return (requiredGas(userOp) + overhead) * gasPrice(userOp);\\n }\\n\\n function hasPaymaster(UserOperation calldata userOp) internal pure returns (bool) {\\n return userOp.paymaster != address(0);\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n //lighter signature scheme. must match UserOp.ts#packUserOp\\n bytes calldata sig = userOp.signature;\\n assembly {\\n let ofs := userOp\\n let len := sub(sub(sig.offset, ofs), 32)\\n ret := mload(0x40)\\n mstore(0x40, add(ret, add(len, 32)))\\n mstore(ret, len)\\n calldatacopy(add(ret, 32), ofs, len)\\n }\\n return ret;\\n\\n //TODO: eip712-style ?\\n return abi.encode(\\n userOp.sender,\\n userOp.nonce,\\n keccak256(userOp.initCode),\\n keccak256(userOp.callData),\\n userOp.callGas,\\n userOp.verificationGas,\\n userOp.preVerificationGas,\\n userOp.maxFeePerGas,\\n userOp.maxPriorityFeePerGas,\\n userOp.paymaster,\\n keccak256(userOp.paymasterData)\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\",\\n keccak256(pack(userOp))));\\n }\\n\\n function min(uint a, uint b) internal pure returns (uint) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x7ea8383b9bbd8cfa5a96f59e1f37c20a681daa798b80d67eb52ade3c53f3ea30\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleWallet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"../IWallet.sol\\\";\\nimport \\\"../EntryPoint.sol\\\";\\n\\nimport \\\"hardhat/console.sol\\\";\\n\\n//minimal wallet\\n// this is sample minimal wallet.\\n// has execute, eth handling methods\\n// has a single signer that can send requests through the entryPoint.\\ncontract SimpleWallet is IWallet {\\n using UserOperationLib for UserOperation;\\n struct OwnerNonce {\\n uint96 nonce;\\n address owner;\\n }\\n OwnerNonce ownerNonce;\\n EntryPoint public entryPoint;\\n\\n function nonce() public view returns (uint) {\\n return ownerNonce.nonce;\\n }\\n\\n function owner() public view returns(address) {\\n return ownerNonce.owner;\\n }\\n\\n event EntryPointChanged(EntryPoint oldEntryPoint, EntryPoint newEntryPoint);\\n\\n receive() external payable {}\\n\\n constructor(EntryPoint _entryPoint, address _owner) {\\n entryPoint = _entryPoint;\\n ownerNonce.owner = _owner;\\n }\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the entryPoint (which gets redirected through execFromEntryPoint)\\n require(msg.sender == ownerNonce.owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n function transfer(address payable dest, uint amount) external onlyOwner {\\n dest.transfer(amount);\\n }\\n\\n function exec(address dest, uint value, bytes calldata func) external onlyOwner {\\n _call(dest, value, func);\\n }\\n\\n function updateEntryPoint(EntryPoint _entryPoint) external onlyOwner {\\n emit EntryPointChanged(entryPoint, _entryPoint);\\n entryPoint = _entryPoint;\\n }\\n\\n function _requireFromEntryPoint() internal view {\\n require(msg.sender == address(entryPoint), \\\"wallet: not from EntryPoint\\\");\\n }\\n\\n function verifyUserOp(UserOperation calldata userOp, uint requiredPrefund) external override {\\n _requireFromEntryPoint();\\n _validateSignature(userOp);\\n _validateAndIncrementNonce(userOp);\\n _payPrefund(requiredPrefund);\\n }\\n\\n function _payPrefund(uint requiredPrefund) internal {\\n if (requiredPrefund != 0) {\\n (bool success) = payable(msg.sender).send(requiredPrefund);\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not wallet.)\\n }\\n }\\n\\n //called by entryPoint, only after verifyUserOp succeeded.\\n function execFromEntryPoint(address dest, uint value, bytes calldata func) external {\\n _requireFromEntryPoint();\\n _call(dest, value, func);\\n }\\n\\n function _validateAndIncrementNonce(UserOperation calldata userOp) internal {\\n //during construction, the \\\"nonce\\\" field hold the salt.\\n // if we assert it is zero, then we allow only a single wallet per owner.\\n if (userOp.initCode.length == 0) {\\n require(ownerNonce.nonce++ == userOp.nonce, \\\"wallet: invalid nonce\\\");\\n }\\n }\\n\\n function _validateSignature(UserOperation calldata userOp) internal view {\\n\\n bytes32 hash = userOp.hash();\\n (bytes32 r, bytes32 s, uint8 v) = _rsv(userOp.signature);\\n\\n require(owner() == _ecrecover(hash, v, r, s), \\\"wallet: wrong signature\\\");\\n }\\n\\n function _rsv(bytes calldata signature) internal pure returns (bytes32 r, bytes32 s, uint8 v) {\\n\\n require(signature.length == 65, \\\"wallet: invalid signature length\\\");\\n assembly {\\n r := calldataload(signature.offset)\\n s := calldataload(add(signature.offset, 0x20))\\n v := byte(0, calldataload(add(signature.offset, 0x40)))\\n }\\n }\\n\\n function _ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n return ecrecover(hash, v, r, s);\\n }\\n\\n function _call(address sender, uint value, bytes memory data) internal {\\n (bool success, bytes memory result) = sender.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(result, add(result, 32))\\n }\\n }\\n }\\n\\n function addDeposit() public payable {\\n entryPoint.addDeposit{value : msg.value}();\\n }\\n\\n function withdrawDeposit(address payable withdrawAddress) public {\\n entryPoint.withdrawStake(withdrawAddress);\\n }\\n}\\n\",\"keccak256\":\"0xf3afea609dd9502a958ce8dbbef6fd2271663c750d356cf911a082f2fa4e7d4b\",\"license\":\"GPL-3.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x72b6a1d297cd3b033d7c2e4a7e7864934bb767db6453623f1c3082c6534547f4\",\"license\":\"MIT\"}},\"version\":1}",
+ "bytecode": "0x608060405234801561001057600080fd5b50604051610aed380380610aed83398101604081905261002f91610077565b600180546001600160a01b039384166001600160a01b031990911617905560008054919092166c01000000000000000000000000026001600160601b039091161790556100c9565b6000806040838503121561008a57600080fd5b8251610095816100b1565b60208401519092506100a6816100b1565b809150509250929050565b6001600160a01b03811681146100c657600080fd5b50565b610a15806100d86000396000f3fe6080604052600436106100955760003560e01c80638da5cb5b116100595780638da5cb5b1461012b578063a9059cbb14610169578063affed0e014610189578063b0d691fe146101b0578063fbfb39e0146101d057600080fd5b80630565bb67146100a15780631b71bb6e146100c35780634a58db19146100e357806351e41700146100eb57806380c5c7d01461010b57600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610846565b6101f0565b005b3480156100cf57600080fd5b506100c16100de3660046107f6565b61023f565b6100c16102b0565b3480156100f757600080fd5b506100c16101063660046107f6565b61031b565b34801561011757600080fd5b506100c1610126366004610846565b610362565b34801561013757600080fd5b50600054600160601b90046001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561017557600080fd5b506100c161018436600461081a565b61036a565b34801561019557600080fd5b506000546001600160601b0316604051908152602001610160565b3480156101bc57600080fd5b5060015461014c906001600160a01b031681565b3480156101dc57600080fd5b506100c16101eb3660046108cf565b6103ad565b6101f86103d4565b610239848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061043392505050565b50505050565b6102476103d4565b600154604080516001600160a01b03928316815291831660208301527f450909c1478d09248269d4ad4fa8cba61ca3f50faed58c7aedefa51c7f62b83a910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b600160009054906101000a90046001600160a01b03166001600160a01b0316634a58db19346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561030057600080fd5b505af1158015610314573d6000803e3d6000fd5b5050505050565b60015460405163611d2e7560e11b81526001600160a01b0383811660048301529091169063c23a5cea90602401600060405180830381600087803b15801561030057600080fd5b6101f86104a2565b6103726103d4565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156103a8573d6000803e3d6000fd5b505050565b6103b56104a2565b6103be826104fc565b6103c7826105ae565b6103d081610658565b5050565b600054600160601b90046001600160a01b03163314806103f357503330145b6104315760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b60448201526064015b60405180910390fd5b565b600080846001600160a01b0316848460405161044f919061090c565b60006040518083038185875af1925050503d806000811461048c576040519150601f19603f3d011682016040523d82523d6000602084013e610491565b606091505b509150915081610314576020810181fd5b6001546001600160a01b031633146104315760405162461bcd60e51b815260206004820152601b60248201527f77616c6c65743a206e6f742066726f6d20456e747279506f696e7400000000006044820152606401610428565b600061050782610680565b90506000808061052361051e610160870187610947565b6106e3565b9250925092506105358482858561074f565b6001600160a01b03166105586000546001600160a01b03600160601b9091041690565b6001600160a01b0316146103145760405162461bcd60e51b815260206004820152601760248201527f77616c6c65743a2077726f6e67207369676e61747572650000000000000000006044820152606401610428565b6105bb6040820182610947565b1515905061065557600080546020830135916001600160601b0390911690806105e383610995565b91906101000a8154816001600160601b0302191690836001600160601b031602179055506001600160601b0316146106555760405162461bcd60e51b815260206004820152601560248201527477616c6c65743a20696e76616c6964206e6f6e636560581b6044820152606401610428565b50565b801561065557604051600090339083156108fc0290849084818181858888f150505050505050565b600061068b826107b7565b80516020918201206040517f19457468657265756d205369676e6564204d6573736167653a0a33320000000092810192909252603c820152605c01604051602081830303815290604052805190602001209050919050565b60008080604184146107375760405162461bcd60e51b815260206004820181905260248201527f77616c6c65743a20696e76616c6964207369676e6174757265206c656e6774686044820152606401610428565b50508235936020840135936040013560001a92509050565b6040805160008082526020820180845287905260ff861692820192909252606081018490526080810183905260019060a0016020604051602081039080840390855afa1580156107a3573d6000803e3d6000fd5b5050604051601f1901519695505050505050565b60603660006107ca610160850185610947565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b60006020828403121561080857600080fd5b8135610813816109ca565b9392505050565b6000806040838503121561082d57600080fd5b8235610838816109ca565b946020939093013593505050565b6000806000806060858703121561085c57600080fd5b8435610867816109ca565b935060208501359250604085013567ffffffffffffffff8082111561088b57600080fd5b818701915087601f83011261089f57600080fd5b8135818111156108ae57600080fd5b8860208285010111156108c057600080fd5b95989497505060200194505050565b600080604083850312156108e257600080fd5b823567ffffffffffffffff8111156108f957600080fd5b8301610180818603121561083857600080fd5b6000825160005b8181101561092d5760208186018101518583015201610913565b8181111561093c576000828501525b509190910192915050565b6000808335601e1984360301811261095e57600080fd5b83018035915067ffffffffffffffff82111561097957600080fd5b60200191503681900382131561098e57600080fd5b9250929050565b60006001600160601b03808316818114156109c057634e487b7160e01b600052601160045260246000fd5b6001019392505050565b6001600160a01b038116811461065557600080fdfea264697066735822122060a95252b25b23dd208aa04a5a7d75efffd9ee1f7980d087a2ac978cfed715bd64736f6c63430008070033",
+ "deployedBytecode": "0x6080604052600436106100955760003560e01c80638da5cb5b116100595780638da5cb5b1461012b578063a9059cbb14610169578063affed0e014610189578063b0d691fe146101b0578063fbfb39e0146101d057600080fd5b80630565bb67146100a15780631b71bb6e146100c35780634a58db19146100e357806351e41700146100eb57806380c5c7d01461010b57600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc366004610846565b6101f0565b005b3480156100cf57600080fd5b506100c16100de3660046107f6565b61023f565b6100c16102b0565b3480156100f757600080fd5b506100c16101063660046107f6565b61031b565b34801561011757600080fd5b506100c1610126366004610846565b610362565b34801561013757600080fd5b50600054600160601b90046001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561017557600080fd5b506100c161018436600461081a565b61036a565b34801561019557600080fd5b506000546001600160601b0316604051908152602001610160565b3480156101bc57600080fd5b5060015461014c906001600160a01b031681565b3480156101dc57600080fd5b506100c16101eb3660046108cf565b6103ad565b6101f86103d4565b610239848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061043392505050565b50505050565b6102476103d4565b600154604080516001600160a01b03928316815291831660208301527f450909c1478d09248269d4ad4fa8cba61ca3f50faed58c7aedefa51c7f62b83a910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b600160009054906101000a90046001600160a01b03166001600160a01b0316634a58db19346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561030057600080fd5b505af1158015610314573d6000803e3d6000fd5b5050505050565b60015460405163611d2e7560e11b81526001600160a01b0383811660048301529091169063c23a5cea90602401600060405180830381600087803b15801561030057600080fd5b6101f86104a2565b6103726103d4565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156103a8573d6000803e3d6000fd5b505050565b6103b56104a2565b6103be826104fc565b6103c7826105ae565b6103d081610658565b5050565b600054600160601b90046001600160a01b03163314806103f357503330145b6104315760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b60448201526064015b60405180910390fd5b565b600080846001600160a01b0316848460405161044f919061090c565b60006040518083038185875af1925050503d806000811461048c576040519150601f19603f3d011682016040523d82523d6000602084013e610491565b606091505b509150915081610314576020810181fd5b6001546001600160a01b031633146104315760405162461bcd60e51b815260206004820152601b60248201527f77616c6c65743a206e6f742066726f6d20456e747279506f696e7400000000006044820152606401610428565b600061050782610680565b90506000808061052361051e610160870187610947565b6106e3565b9250925092506105358482858561074f565b6001600160a01b03166105586000546001600160a01b03600160601b9091041690565b6001600160a01b0316146103145760405162461bcd60e51b815260206004820152601760248201527f77616c6c65743a2077726f6e67207369676e61747572650000000000000000006044820152606401610428565b6105bb6040820182610947565b1515905061065557600080546020830135916001600160601b0390911690806105e383610995565b91906101000a8154816001600160601b0302191690836001600160601b031602179055506001600160601b0316146106555760405162461bcd60e51b815260206004820152601560248201527477616c6c65743a20696e76616c6964206e6f6e636560581b6044820152606401610428565b50565b801561065557604051600090339083156108fc0290849084818181858888f150505050505050565b600061068b826107b7565b80516020918201206040517f19457468657265756d205369676e6564204d6573736167653a0a33320000000092810192909252603c820152605c01604051602081830303815290604052805190602001209050919050565b60008080604184146107375760405162461bcd60e51b815260206004820181905260248201527f77616c6c65743a20696e76616c6964207369676e6174757265206c656e6774686044820152606401610428565b50508235936020840135936040013560001a92509050565b6040805160008082526020820180845287905260ff861692820192909252606081018490526080810183905260019060a0016020604051602081039080840390855afa1580156107a3573d6000803e3d6000fd5b5050604051601f1901519695505050505050565b60603660006107ca610160850185610947565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b60006020828403121561080857600080fd5b8135610813816109ca565b9392505050565b6000806040838503121561082d57600080fd5b8235610838816109ca565b946020939093013593505050565b6000806000806060858703121561085c57600080fd5b8435610867816109ca565b935060208501359250604085013567ffffffffffffffff8082111561088b57600080fd5b818701915087601f83011261089f57600080fd5b8135818111156108ae57600080fd5b8860208285010111156108c057600080fd5b95989497505060200194505050565b600080604083850312156108e257600080fd5b823567ffffffffffffffff8111156108f957600080fd5b8301610180818603121561083857600080fd5b6000825160005b8181101561092d5760208186018101518583015201610913565b8181111561093c576000828501525b509190910192915050565b6000808335601e1984360301811261095e57600080fd5b83018035915067ffffffffffffffff82111561097957600080fd5b60200191503681900382131561098e57600080fd5b9250929050565b60006001600160601b03808316818114156109c057634e487b7160e01b600052601160045260246000fd5b6001019392505050565b6001600160a01b038116811461065557600080fdfea264697066735822122060a95252b25b23dd208aa04a5a7d75efffd9ee1f7980d087a2ac978cfed715bd64736f6c63430008070033",
+ "devdoc": {
+ "kind": "dev",
+ "methods": {},
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {},
+ "version": 1
+ },
+ "storageLayout": {
+ "storage": [
+ {
+ "astId": 2814,
+ "contract": "contracts/samples/SimpleWallet.sol:SimpleWallet",
+ "label": "ownerNonce",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_struct(OwnerNonce)2811_storage"
+ },
+ {
+ "astId": 2817,
+ "contract": "contracts/samples/SimpleWallet.sol:SimpleWallet",
+ "label": "entryPoint",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_contract(EntryPoint)2231"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "encoding": "inplace",
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_contract(EntryPoint)2231": {
+ "encoding": "inplace",
+ "label": "contract EntryPoint",
+ "numberOfBytes": "20"
+ },
+ "t_struct(OwnerNonce)2811_storage": {
+ "encoding": "inplace",
+ "label": "struct SimpleWallet.OwnerNonce",
+ "members": [
+ {
+ "astId": 2808,
+ "contract": "contracts/samples/SimpleWallet.sol:SimpleWallet",
+ "label": "nonce",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint96"
+ },
+ {
+ "astId": 2810,
+ "contract": "contracts/samples/SimpleWallet.sol:SimpleWallet",
+ "label": "owner",
+ "offset": 12,
+ "slot": "0",
+ "type": "t_address"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint96": {
+ "encoding": "inplace",
+ "label": "uint96",
+ "numberOfBytes": "12"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/TestCounter.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/TestCounter.json
new file mode 100644
index 000000000..0dbb2ce01
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/TestCounter.json
@@ -0,0 +1,118 @@
+{
+ "address": "0x4B52ceEDE2e695CAeDBC1Cc8E7f9d5Ef18F0EeF5",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "count",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "counters",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "repeat",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "name": "gasWaster",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "args": [],
+ "solcInputHash": "9255faacf3ae4e81db1326413027bfa0",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"count\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"counters\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"repeat\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"gasWaster\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TestCounter.sol\":\"TestCounter\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/IWallet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IWallet {\\n\\n // validate user's signature and nonce\\n // @param requiredPrefund how much this wallet should pre-fund the transaction.\\n // @note that after execution, the excess is sent back to the wallet.\\n // @note if requiredPrefund is zero, the wallet MUST NOT send anything (the paymaster pays)\\n function verifyUserOp(UserOperation calldata userOp, uint requiredPrefund) external;\\n}\\n\",\"keccak256\":\"0x29f98a4e6033cd10007dcc9b569fda950413cc91d8560a67f20a35e8185c9228\",\"license\":\"GPL-3.0\"},\"contracts/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"hardhat/console.sol\\\";\\n\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint callGas;\\n uint verificationGas;\\n uint preVerificationGas;\\n uint maxFeePerGas;\\n uint maxPriorityFeePerGas;\\n address paymaster;\\n bytes paymasterData;\\n bytes signature;\\n }\\n\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal view returns (address ret) {\\n assembly {ret := calldataload(userOp)}\\n }\\n\\n //relayer/miner might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint) {\\n unchecked {\\n return min(userOp.maxFeePerGas, userOp.maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function requiredGas(UserOperation calldata userOp) internal pure returns (uint) {\\n unchecked {\\n return userOp.callGas + userOp.verificationGas + userOp.preVerificationGas;\\n }\\n }\\n\\n function requiredPreFund(UserOperation calldata userOp, uint overhead) internal view returns (uint prefund) {\\n return (requiredGas(userOp) + overhead) * gasPrice(userOp);\\n }\\n\\n function hasPaymaster(UserOperation calldata userOp) internal pure returns (bool) {\\n return userOp.paymaster != address(0);\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n //lighter signature scheme. must match UserOp.ts#packUserOp\\n bytes calldata sig = userOp.signature;\\n assembly {\\n let ofs := userOp\\n let len := sub(sub(sig.offset, ofs), 32)\\n ret := mload(0x40)\\n mstore(0x40, add(ret, add(len, 32)))\\n mstore(ret, len)\\n calldatacopy(add(ret, 32), ofs, len)\\n }\\n return ret;\\n\\n //TODO: eip712-style ?\\n return abi.encode(\\n userOp.sender,\\n userOp.nonce,\\n keccak256(userOp.initCode),\\n keccak256(userOp.callData),\\n userOp.callGas,\\n userOp.verificationGas,\\n userOp.preVerificationGas,\\n userOp.maxFeePerGas,\\n userOp.maxPriorityFeePerGas,\\n userOp.paymaster,\\n keccak256(userOp.paymasterData)\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\",\\n keccak256(pack(userOp))));\\n }\\n\\n function min(uint a, uint b) internal pure returns (uint) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x7ea8383b9bbd8cfa5a96f59e1f37c20a681daa798b80d67eb52ade3c53f3ea30\",\"license\":\"GPL-3.0\"},\"contracts/test/TestCounter.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.7;\\n\\nimport \\\"../UserOperation.sol\\\";\\nimport \\\"../IWallet.sol\\\";\\n\\n//sample \\\"receiver\\\" contract, for testing \\\"exec\\\" from wallet.\\ncontract TestCounter {\\n mapping(address => uint) public counters;\\n\\n function count() public {\\n counters[msg.sender] = counters[msg.sender] + 1;\\n\\n }\\n\\n //helper method to waste gas\\n // repeat - waste gas on writing storage in a loop\\n // junk - dynamic buffer to stress the function size.\\n mapping(uint => uint) xxx;\\n uint offset;\\n\\n function gasWaster(uint repeat, string calldata /*junk*/) external {\\n for (uint i = 1; i <= repeat; i++) {\\n offset++;\\n xxx[offset] = i;\\n }\\n }\\n}\",\"keccak256\":\"0xfa15d72740c6ba7c1aca1925e27774b3701a585e866960ca70460ae55e0ae7d3\",\"license\":\"GPL-3.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x72b6a1d297cd3b033d7c2e4a7e7864934bb767db6453623f1c3082c6534547f4\",\"license\":\"MIT\"}},\"version\":1}",
+ "bytecode": "0x608060405234801561001057600080fd5b50610238806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806306661abd14610046578063a1b4689014610050578063be65ab8c14610063575b600080fd5b61004e610095565b005b61004e61005e36600461013d565b6100c2565b61008361007136600461010d565b60006020819052908152604090205481565b60405190815260200160405180910390f35b336000908152602081905260409020546100b09060016101b9565b33600090815260208190526040902055565b60015b83811161010757600280549060006100dc836101d1565b90915550506002546000908152600160205260409020819055806100ff816101d1565b9150506100c5565b50505050565b60006020828403121561011f57600080fd5b81356001600160a01b038116811461013657600080fd5b9392505050565b60008060006040848603121561015257600080fd5b83359250602084013567ffffffffffffffff8082111561017157600080fd5b818601915086601f83011261018557600080fd5b81358181111561019457600080fd5b8760208285010111156101a657600080fd5b6020830194508093505050509250925092565b600082198211156101cc576101cc6101ec565b500190565b60006000198214156101e5576101e56101ec565b5060010190565b634e487b7160e01b600052601160045260246000fdfea26469706673582212202705b7732e8fc4fb811ca9240189d156e252ec8b1aef99971c2fc2cdbeb336d764736f6c63430008070033",
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806306661abd14610046578063a1b4689014610050578063be65ab8c14610063575b600080fd5b61004e610095565b005b61004e61005e36600461013d565b6100c2565b61008361007136600461010d565b60006020819052908152604090205481565b60405190815260200160405180910390f35b336000908152602081905260409020546100b09060016101b9565b33600090815260208190526040902055565b60015b83811161010757600280549060006100dc836101d1565b90915550506002546000908152600160205260409020819055806100ff816101d1565b9150506100c5565b50505050565b60006020828403121561011f57600080fd5b81356001600160a01b038116811461013657600080fd5b9392505050565b60008060006040848603121561015257600080fd5b83359250602084013567ffffffffffffffff8082111561017157600080fd5b818601915086601f83011261018557600080fd5b81358181111561019457600080fd5b8760208285010111156101a657600080fd5b6020830194508093505050509250925092565b600082198211156101cc576101cc6101ec565b500190565b60006000198214156101e5576101e56101ec565b5060010190565b634e487b7160e01b600052601160045260246000fdfea26469706673582212202705b7732e8fc4fb811ca9240189d156e252ec8b1aef99971c2fc2cdbeb336d764736f6c63430008070033",
+ "devdoc": {
+ "kind": "dev",
+ "methods": {},
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {},
+ "version": 1
+ },
+ "storageLayout": {
+ "storage": [
+ {
+ "astId": 3638,
+ "contract": "contracts/test/TestCounter.sol:TestCounter",
+ "label": "counters",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_address,t_uint256)"
+ },
+ {
+ "astId": 3658,
+ "contract": "contracts/test/TestCounter.sol:TestCounter",
+ "label": "xxx",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_mapping(t_uint256,t_uint256)"
+ },
+ {
+ "astId": 3660,
+ "contract": "contracts/test/TestCounter.sol:TestCounter",
+ "label": "offset",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_uint256"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "encoding": "inplace",
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "encoding": "mapping",
+ "key": "t_address",
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32",
+ "value": "t_uint256"
+ },
+ "t_mapping(t_uint256,t_uint256)": {
+ "encoding": "mapping",
+ "key": "t_uint256",
+ "label": "mapping(uint256 => uint256)",
+ "numberOfBytes": "32",
+ "value": "t_uint256"
+ },
+ "t_uint256": {
+ "encoding": "inplace",
+ "label": "uint256",
+ "numberOfBytes": "32"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/solcInputs/9255faacf3ae4e81db1326413027bfa0.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/solcInputs/9255faacf3ae4e81db1326413027bfa0.json
new file mode 100644
index 000000000..5a05e3bbb
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/solcInputs/9255faacf3ae4e81db1326413027bfa0.json
@@ -0,0 +1,86 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "contracts/EntryPoint.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"./StakeManager.sol\";\nimport \"./UserOperation.sol\";\nimport \"./IWallet.sol\";\nimport \"./IPaymaster.sol\";\n\ninterface ICreate2Deployer {\n function deploy(bytes memory _initCode, bytes32 _salt) external returns (address);\n}\n\ncontract EntryPoint is StakeManager {\n\n using UserOperationLib for UserOperation;\n // paymaster locked stake\n // (actual stake should be higher, to cover actual call cost)\n uint256 constant PAYMASTER_STAKE = 1 ether;\n\n enum PaymentMode {\n paymasterStake, // if paymaster is set, use paymaster's stake to pay.\n walletStake, // wallet has enough stake to pay for request.\n walletEth // wallet has no stake. paying with eth.\n }\n\n uint public immutable perOpOverhead;\n address public immutable create2factory;\n\n event UserOperationEvent(address indexed sender, address indexed paymaster, uint nonce, uint actualGasCost, uint actualGasPrice, bool success);\n event UserOperationRevertReason(address indexed sender, uint nonce, bytes revertReason);\n\n event PaymasterPostOpFailed(address indexed sender, address indexed paymaster, uint nonce, bytes reason);\n\n //handleOps reverts with this error struct, to mark the offending op\n // NOTE: if simulateOp passes successfully, there should be no reason for handleOps to fail on it.\n // @param opIndex - index into the array of ops to the failed one (in simulateOp, this is always zero)\n // @param paymaster - if paymaster.verifyPaymasterUserOp fails, this will be the paymaster's address. if verifyUserOp failed,\n // this value will be zero (since it failed before accessing the paymaster)\n // @param reason - revert reason\n // only to aid troubleshooting of wallet/paymaster reverts\n error FailedOp(uint opIndex, address paymaster, string reason);\n\n constructor(address _create2factory, uint _perOpOverhead, uint32 _unstakeDelayBlocks) StakeManager(_unstakeDelayBlocks) {\n create2factory = _create2factory;\n perOpOverhead = _perOpOverhead;\n }\n\n receive() external payable {}\n\n /**\n * Execute the given UserOperation.\n * @param op the operation to execute\n * @param redeemer the contract to redeem the fee\n */\n function handleOp(UserOperation calldata op, address payable redeemer) public {\n\n uint preGas = gasleft();\n\n (uint256 prefund, PaymentMode paymentMode, bytes memory context) = _validatePrepayment(0, op);\n uint preOpGas = preGas - gasleft() + perOpOverhead;\n\n uint actualGasCost;\n\n try this.internalHandleOp(op, context, preOpGas, prefund, paymentMode) returns (uint _actualGasCost) {\n actualGasCost = _actualGasCost;\n } catch {\n uint actualGas = preGas - gasleft() + preOpGas;\n actualGasCost = handlePostOp(IPaymaster.PostOpMode.postOpReverted, op, context, actualGas, prefund, paymentMode);\n }\n\n redeem(redeemer, actualGasCost);\n }\n\n function redeem(address payable redeemer, uint amount) internal {\n redeemer.transfer(amount);\n }\n\n function handleOps(UserOperation[] calldata ops, address payable redeemer) public {\n\n uint opslen = ops.length;\n uint256[] memory preOpGas = new uint256[](opslen);\n bytes32[] memory contexts = new bytes32[](opslen);\n uint256[] memory prefunds = new uint256[](opslen);\n PaymentMode[] memory paymentModes = new PaymentMode[](opslen);\n\n for (uint i = 0; i < opslen; i++) {\n uint preGas = gasleft();\n UserOperation calldata op = ops[i];\n\n bytes memory context;\n bytes32 contextOffset;\n (prefunds[i], paymentModes[i], context) = _validatePrepayment(i, op);\n assembly {contextOffset := context}\n contexts[i] = contextOffset;\n preOpGas[i] = preGas - gasleft() + perOpOverhead;\n }\n\n uint collected = 0;\n\n for (uint i = 0; i < ops.length; i++) {\n uint preGas = gasleft();\n UserOperation calldata op = ops[i];\n bytes32 contextOffset = contexts[i];\n bytes memory context;\n assembly {context := contextOffset}\n uint preOpGasi = preOpGas[i];\n uint prefundi = prefunds[i];\n PaymentMode paymentModei = paymentModes[i];\n\n try this.internalHandleOp(op, context, preOpGasi, prefundi, paymentModei) returns (uint _actualGasCost) {\n collected += _actualGasCost;\n } catch {\n uint actualGas = preGas - gasleft() + preOpGasi;\n collected += handlePostOp(IPaymaster.PostOpMode.postOpReverted, op, context, actualGas, prefundi, paymentModei);\n }\n }\n\n redeem(redeemer, collected);\n }\n\n function internalHandleOp(UserOperation calldata op, bytes calldata context, uint preOpGas, uint prefund, PaymentMode paymentMode) external returns (uint actualGasCost) {\n uint preGas = gasleft();\n require(msg.sender == address(this));\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (op.callData.length > 0) {\n\n (bool success,bytes memory result) = address(op.getSender()).call{gas : op.callGas}(op.callData);\n if (!success && result.length > 0) {\n emit UserOperationRevertReason(op.getSender(), op.nonce, result);\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n uint actualGas = preGas - gasleft() + preOpGas;\n return handlePostOp(mode, op, context, actualGas, prefund, paymentMode);\n }\n\n /**\n * Simulate a call for wallet.verifyUserOp.\n * Call must not revert.\n * @return gasUsedByPayForSelfOp - gas used by the validation, to pass into simulatePaymasterValidation.\n * The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the wallet's data\n */\n function simulateWalletValidation(UserOperation calldata userOp) external returns (uint gasUsedByPayForSelfOp){\n require(msg.sender == address(0), \"must be called off-chain with from=zero-addr\");\n (uint requiredPreFund, PaymentMode paymentMode) = getPaymentInfo(userOp);\n (gasUsedByPayForSelfOp,) = _validateWalletPrepayment(0, userOp, requiredPreFund, paymentMode);\n }\n\n function getPaymentInfo(UserOperation calldata userOp) internal view returns (uint requiredPrefund, PaymentMode paymentMode) {\n requiredPrefund = userOp.requiredPreFund(perOpOverhead);\n if (userOp.hasPaymaster()) {\n paymentMode = PaymentMode.paymasterStake;\n } else if (isStaked(userOp.getSender(), requiredPrefund, 0)) {\n paymentMode = PaymentMode.walletStake;\n } else {\n paymentMode = PaymentMode.walletEth;\n }\n }\n\n /**\n * Simulate a call to paymaster.verifyPaymasterUserOp\n * do nothing if has no paymaster.\n * @param userOp the user operation to validate.\n * @param gasUsedByPayForSelfOp - the gas returned by simulateWalletValidation, as these 2 calls should share\n * the same userOp.validationGas quota.\n * The node must also verify it doesn't use banned opcode, and that it doesn't reference storage outside the paymaster's data\n */\n function simulatePaymasterValidation(UserOperation calldata userOp, uint gasUsedByPayForSelfOp) external view returns (bytes memory context, uint gasUsedByPayForOp){\n (uint requiredPreFund, PaymentMode paymentMode) = getPaymentInfo(userOp);\n if (paymentMode != PaymentMode.paymasterStake) {\n return (\"\", 0);\n }\n return _validatePaymasterPrepayment(0, userOp, requiredPreFund, gasUsedByPayForSelfOp);\n }\n\n // get the sender address, or use \"create2\" to create it.\n // note that the gas allocation for this creation is deterministic (by the size of callData),\n // so it is not checked on-chain, and adds to the gas used by verifyUserOp\n function _createSenderIfNeeded(UserOperation calldata op) internal {\n if (op.initCode.length != 0) {\n //its a create operation. run the create2\n // note that we're still under the gas limit of validate, so probably\n // this create2 creates a proxy account.\n // appending signer makes the request unique, so no one else can make this request.\n //nonce is meaningless during create, so we re-purpose it as salt\n address sender1 = ICreate2Deployer(create2factory).deploy(op.initCode, bytes32(op.nonce));\n require(sender1 != address(0), \"create2 failed\");\n require(sender1 == op.getSender(), \"sender doesn't match create2 address\");\n }\n }\n\n //get counterfactual sender address.\n // use the initCode and salt in the UserOperation tot create this sender contract\n function getSenderAddress(bytes memory initCode, uint _salt) public view returns (address) {\n bytes32 hash = keccak256(\n abi.encodePacked(\n bytes1(0xff),\n address(create2factory),\n _salt,\n keccak256(initCode)\n )\n );\n\n // NOTE: cast last 20 bytes of hash to address\n return address(uint160(uint256(hash)));\n }\n\n //call wallet.verifyUserOp, and validate that it paid as needed.\n // return actual value sent from wallet to \"this\"\n function _validateWalletPrepayment(uint opIndex, UserOperation calldata op, uint requiredPrefund, PaymentMode paymentMode) internal returns (uint gasUsedByPayForSelfOp, uint prefund) {\n uint preGas = gasleft();\n _createSenderIfNeeded(op);\n uint preBalance = address(this).balance;\n uint requiredEthPrefund = 0;\n if (paymentMode == PaymentMode.walletEth) {\n requiredEthPrefund = requiredPrefund;\n } else if (paymentMode == PaymentMode.walletStake) {\n _prefundFromSender(op, requiredPrefund);\n } else {\n // paymaster pays in handlePostOp\n }\n try IWallet(op.getSender()).verifyUserOp{gas : op.verificationGas}(op, requiredEthPrefund) {\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, address(0), revertReason);\n } catch {\n revert FailedOp(opIndex, address(0), \"\");\n }\n uint actualEthPrefund = address(this).balance - preBalance;\n\n if (paymentMode == PaymentMode.walletEth) {\n if (actualEthPrefund < requiredEthPrefund) {\n revert FailedOp(opIndex, address(0), \"wallet didn't pay prefund\");\n }\n prefund = actualEthPrefund;\n } else if (paymentMode == PaymentMode.walletStake) {\n if (actualEthPrefund != 0) {\n revert FailedOp(opIndex, address(0), \"using wallet stake but wallet paid eth\");\n }\n prefund = requiredPrefund;\n } else {\n if (actualEthPrefund != 0) {\n revert FailedOp(opIndex, address(0), \"has paymaster but wallet paid\");\n }\n prefund = requiredPrefund;\n }\n\n gasUsedByPayForSelfOp = preGas - gasleft();\n }\n\n //validate paymaster.verifyPaymasterUserOp\n function _validatePaymasterPrepayment(uint opIndex, UserOperation calldata op, uint requiredPreFund, uint gasUsedByPayForSelfOp) internal view returns (bytes memory context, uint gasUsedByPayForOp) {\n uint preGas = gasleft();\n if (!isValidStake(op, requiredPreFund)) {\n revert FailedOp(opIndex, op.paymaster, \"not enough stake\");\n }\n //no pre-pay from paymaster\n uint gas = op.verificationGas - gasUsedByPayForSelfOp;\n try IPaymaster(op.paymaster).verifyPaymasterUserOp{gas : gas}(op, requiredPreFund) returns (bytes memory _context){\n context = _context;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, op.paymaster, revertReason);\n } catch {\n revert FailedOp(opIndex, op.paymaster, \"\");\n }\n gasUsedByPayForOp = preGas - gasleft();\n }\n\n function _validatePrepayment(uint opIndex, UserOperation calldata userOp) private returns (uint prefund, PaymentMode paymentMode, bytes memory context){\n\n uint preGas = gasleft();\n uint gasUsedByPayForSelfOp;\n uint requiredPreFund;\n (requiredPreFund, paymentMode) = getPaymentInfo(userOp);\n\n (gasUsedByPayForSelfOp, prefund) = _validateWalletPrepayment(opIndex, userOp, requiredPreFund, paymentMode);\n\n uint gasUsedByPayForOp = 0;\n if (paymentMode == PaymentMode.paymasterStake) {\n (context, gasUsedByPayForOp) = _validatePaymasterPrepayment(opIndex, userOp, requiredPreFund, gasUsedByPayForSelfOp);\n } else {\n context = \"\";\n }\n uint gasUsed = preGas - gasleft();\n\n if (userOp.verificationGas < gasUsed) {\n revert FailedOp(opIndex, userOp.paymaster, \"Used more than verificationGas\");\n }\n }\n\n function getPaymastersStake(address[] calldata paymasters) external view returns (uint[] memory _stakes) {\n _stakes = new uint[](paymasters.length);\n for (uint i = 0; i < paymasters.length; i++) {\n _stakes[i] = stakes[paymasters[i]].stake;\n }\n }\n\n function handlePostOp(IPaymaster.PostOpMode mode, UserOperation calldata op, bytes memory context, uint actualGas, uint prefund, PaymentMode paymentMode) private returns (uint actualGasCost) {\n uint preGas = gasleft();\n uint gasPrice = UserOperationLib.gasPrice(op);\n actualGasCost = actualGas * gasPrice;\n if (paymentMode != PaymentMode.paymasterStake) {\n if (prefund < actualGasCost) {\n revert (\"wallet prefund below actualGasCost\");\n }\n uint refund = prefund - actualGasCost;\n if (paymentMode == PaymentMode.walletStake) {\n _refundSenderStake(op, refund);\n } else {\n _refundSender(op, refund);\n }\n } else {\n if (context.length > 0) {\n //if paymaster.postOp reverts:\n // - emit a message (just for sake of debugging of this poor paymaster)\n // - paymaster still pays (from its stake)\n try IPaymaster(op.paymaster).postOp(mode, context, actualGasCost) {}\n catch (bytes memory errdata) {\n emit PaymasterPostOpFailed(op.getSender(), op.paymaster, op.nonce, errdata);\n }\n }\n //paymaster pays for full gas, including for postOp (and revert event)\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n //paymaster balance known to be high enough, and to be locked for this block\n stakes[op.paymaster].stake -= uint96(actualGasCost);\n }\n _emitLog(op, actualGasCost, gasPrice, mode == IPaymaster.PostOpMode.opSucceeded);\n }\n\n function _emitLog(UserOperation calldata op, uint actualGasCost, uint gasPrice, bool success) internal {\n emit UserOperationEvent(op.getSender(), op.paymaster, op.nonce, actualGasCost, gasPrice, success);\n }\n\n function _prefundFromSender(UserOperation calldata userOp, uint requiredPrefund) internal {\n stakes[userOp.getSender()].stake -= uint96(requiredPrefund);\n }\n\n function _refundSender(UserOperation calldata userOp, uint refund) internal {\n //NOTE: deliberately ignoring revert: wallet should accept refund.\n bool sendOk = payable(userOp.getSender()).send(refund);\n (sendOk);\n }\n function _refundSenderStake(UserOperation calldata userOp, uint refund) internal {\n stakes[userOp.getSender()].stake += uint96(refund);\n }\n\n function isValidStake(UserOperation calldata userOp, uint requiredPreFund) internal view returns (bool) {\n return isPaymasterStaked(userOp.paymaster, PAYMASTER_STAKE + requiredPreFund);\n }\n\n function isPaymasterStaked(address paymaster, uint stake) public view returns (bool) {\n return isStaked(paymaster, stake, unstakeDelayBlocks);\n }\n\n function isContractDeployed(address addr) external view returns (bool) {\n bytes32 hash;\n assembly {\n hash := extcodehash(addr)\n }\n return hash != bytes32(0);\n }\n}\n\n"
+ },
+ "contracts/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8;\n\nimport \"hardhat/console.sol\";\n\ncontract StakeManager {\n\n /// minimum number of blocks to after 'unlock' before amount can be withdrawn.\n uint32 immutable public unstakeDelayBlocks;\n\n constructor(uint32 _unstakeDelayBlocks) {\n unstakeDelayBlocks = _unstakeDelayBlocks;\n }\n\n event StakeAdded(\n address indexed paymaster,\n uint256 totalStake,\n uint256 unstakeDelayBlocks\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocking(\n address indexed paymaster,\n uint256 withdrawBlock\n );\n\n event StakeWithdrawn(\n address indexed paymaster,\n address withdrawAddress,\n uint256 amount\n );\n\n /// @param stake - amount of ether staked for this paymaster\n /// @param withdrawStake - once 'unlocked' the value is no longer staked.\n /// @param withdrawBlock - first block number 'withdraw' will be callable, or zero if the unlock has not been called\n struct StakeInfo {\n uint96 stake;\n uint32 unstakeDelayBlocks;\n uint96 withdrawStake;\n uint32 withdrawBlock;\n }\n\n /// maps relay managers to their stakes\n mapping(address => StakeInfo) public stakes;\n\n function getStakeInfo(address paymaster) external view returns (StakeInfo memory stakeInfo) {\n return stakes[paymaster];\n }\n\n /**\n * add a deposit (just like stake, but with lock=0\n * cancel any pending unlock\n */\n function addDeposit() external payable {\n addStake(0);\n }\n\n //add deposit to another account (doesn't change lock status)\n function addDepositTo(address target) external payable {\n stakes[target].stake += uint96(msg.value);\n }\n\n /**\n * add stake value for this paymaster.\n * cancel any pending unlock\n */\n function addStake(uint32 _unstakeDelayBlocks) public payable {\n require(_unstakeDelayBlocks >= stakes[msg.sender].unstakeDelayBlocks, \"cannot decrease unstake blocks\");\n uint96 stake = uint96(stakes[msg.sender].stake + msg.value + stakes[msg.sender].withdrawStake);\n stakes[msg.sender] = StakeInfo(\n stake,\n _unstakeDelayBlocks,\n 0,\n 0);\n emit StakeAdded(msg.sender, stake, _unstakeDelayBlocks);\n }\n\n function unlockStake() external {\n StakeInfo storage info = stakes[msg.sender];\n require(info.withdrawBlock == 0, \"already pending\");\n require(info.stake != 0 && info.unstakeDelayBlocks != 0, \"no stake to unlock\");\n uint32 withdrawBlock = uint32(block.number) + info.unstakeDelayBlocks;\n info.withdrawBlock = withdrawBlock;\n info.withdrawStake = info.stake;\n info.stake = 0;\n emit StakeUnlocking(msg.sender, withdrawBlock);\n }\n\n function withdrawStake(address payable withdrawAddress) external {\n StakeInfo memory info = stakes[msg.sender];\n if (info.unstakeDelayBlocks != 0) {\n require(info.withdrawStake > 0, \"no unlocked stake\");\n require(info.withdrawBlock <= block.number, \"Withdrawal is not due\");\n }\n uint256 amount = info.withdrawStake + info.stake;\n stakes[msg.sender] = StakeInfo(0, info.unstakeDelayBlocks, 0, 0);\n withdrawAddress.transfer(amount);\n emit StakeWithdrawn(msg.sender, withdrawAddress, amount);\n }\n\n function isStaked(address paymaster, uint requiredStake, uint requiredDelayBlocks) public view returns (bool) {\n StakeInfo memory stakeInfo = stakes[paymaster];\n return stakeInfo.stake >= requiredStake && stakeInfo.unstakeDelayBlocks >= requiredDelayBlocks;\n }\n}\n"
+ },
+ "contracts/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"hardhat/console.sol\";\n\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint callGas;\n uint verificationGas;\n uint preVerificationGas;\n uint maxFeePerGas;\n uint maxPriorityFeePerGas;\n address paymaster;\n bytes paymasterData;\n bytes signature;\n }\n\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal view returns (address ret) {\n assembly {ret := calldataload(userOp)}\n }\n\n //relayer/miner might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint) {\n unchecked {\n return min(userOp.maxFeePerGas, userOp.maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function requiredGas(UserOperation calldata userOp) internal pure returns (uint) {\n unchecked {\n return userOp.callGas + userOp.verificationGas + userOp.preVerificationGas;\n }\n }\n\n function requiredPreFund(UserOperation calldata userOp, uint overhead) internal view returns (uint prefund) {\n return (requiredGas(userOp) + overhead) * gasPrice(userOp);\n }\n\n function hasPaymaster(UserOperation calldata userOp) internal pure returns (bool) {\n return userOp.paymaster != address(0);\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n //lighter signature scheme. must match UserOp.ts#packUserOp\n bytes calldata sig = userOp.signature;\n assembly {\n let ofs := userOp\n let len := sub(sub(sig.offset, ofs), 32)\n ret := mload(0x40)\n mstore(0x40, add(ret, add(len, 32)))\n mstore(ret, len)\n calldatacopy(add(ret, 32), ofs, len)\n }\n return ret;\n\n //TODO: eip712-style ?\n return abi.encode(\n userOp.sender,\n userOp.nonce,\n keccak256(userOp.initCode),\n keccak256(userOp.callData),\n userOp.callGas,\n userOp.verificationGas,\n userOp.preVerificationGas,\n userOp.maxFeePerGas,\n userOp.maxPriorityFeePerGas,\n userOp.paymaster,\n keccak256(userOp.paymasterData)\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\",\n keccak256(pack(userOp))));\n }\n\n function min(uint a, uint b) internal pure returns (uint) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/IWallet.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"./UserOperation.sol\";\n\ninterface IWallet {\n\n // validate user's signature and nonce\n // @param requiredPrefund how much this wallet should pre-fund the transaction.\n // @note that after execution, the excess is sent back to the wallet.\n // @note if requiredPrefund is zero, the wallet MUST NOT send anything (the paymaster pays)\n function verifyUserOp(UserOperation calldata userOp, uint requiredPrefund) external;\n}\n"
+ },
+ "contracts/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"./UserOperation.sol\";\n\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now its a 2nd call, after user's op was deliberately reverted.\n }\n // payment validation: check if paymaster agree to pay (using its stake)\n // revert to reject this request.\n // actual payment is done after postOp is called, by deducting actual call cost form the paymaster's stake.\n // @param userOp the user operation\n // @param maxcost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n // @returns context value to send to a postOp\n // zero length to signify postOp is not required.\n function verifyPaymasterUserOp(UserOperation calldata userOp, uint maxcost) external view returns (bytes memory context);\n\n // post-operation handler.\n // @param mode\n // opSucceeded - user operation succeeded.\n // opReverted - user op reverted. still has to pay for gas.\n // postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n // Now this is the 2nd call, after user's op was deliberately reverted.\n // @param context - the context value returned by verifyPaymasterUserOp\n // @param actualGasCost - actual gas used so far (without this postOp call).\n function postOp(PostOpMode mode, bytes calldata context, uint actualGasCost) external;\n}\n"
+ },
+ "hardhat/console.sol": {
+ "content": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.22 <0.9.0;\n\nlibrary console {\n\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n\tfunction _sendLogPayload(bytes memory payload) private view {\n\t\tuint256 payloadLength = payload.length;\n\t\taddress consoleAddress = CONSOLE_ADDRESS;\n\t\tassembly {\n\t\t\tlet payloadStart := add(payload, 32)\n\t\t\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n\t\t}\n\t}\n\n\tfunction log() internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log()\"));\n\t}\n\n\tfunction logInt(int p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(int)\", p0));\n\t}\n\n\tfunction logUint(uint p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n\t}\n\n\tfunction logString(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction logBool(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction logAddress(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction logBytes(bytes memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n\t}\n\n\tfunction logBytes1(bytes1 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n\t}\n\n\tfunction logBytes2(bytes2 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n\t}\n\n\tfunction logBytes3(bytes3 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n\t}\n\n\tfunction logBytes4(bytes4 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n\t}\n\n\tfunction logBytes5(bytes5 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n\t}\n\n\tfunction logBytes6(bytes6 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n\t}\n\n\tfunction logBytes7(bytes7 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n\t}\n\n\tfunction logBytes8(bytes8 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n\t}\n\n\tfunction logBytes9(bytes9 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n\t}\n\n\tfunction logBytes10(bytes10 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n\t}\n\n\tfunction logBytes11(bytes11 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n\t}\n\n\tfunction logBytes12(bytes12 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n\t}\n\n\tfunction logBytes13(bytes13 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n\t}\n\n\tfunction logBytes14(bytes14 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n\t}\n\n\tfunction logBytes15(bytes15 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n\t}\n\n\tfunction logBytes16(bytes16 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n\t}\n\n\tfunction logBytes17(bytes17 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n\t}\n\n\tfunction logBytes18(bytes18 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n\t}\n\n\tfunction logBytes19(bytes19 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n\t}\n\n\tfunction logBytes20(bytes20 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n\t}\n\n\tfunction logBytes21(bytes21 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n\t}\n\n\tfunction logBytes22(bytes22 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n\t}\n\n\tfunction logBytes23(bytes23 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n\t}\n\n\tfunction logBytes24(bytes24 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n\t}\n\n\tfunction logBytes25(bytes25 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n\t}\n\n\tfunction logBytes26(bytes26 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n\t}\n\n\tfunction logBytes27(bytes27 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n\t}\n\n\tfunction logBytes28(bytes28 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n\t}\n\n\tfunction logBytes29(bytes29 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n\t}\n\n\tfunction logBytes30(bytes30 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n\t}\n\n\tfunction logBytes31(bytes31 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n\t}\n\n\tfunction logBytes32(bytes32 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n\t}\n\n\tfunction log(uint p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n\t}\n\n\tfunction log(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction log(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction log(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction log(uint p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n\t}\n\n\tfunction log(address p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint)\", p0, p1));\n\t}\n\n\tfunction log(address p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n\t}\n\n\tfunction log(address p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n\t}\n\n\tfunction log(address p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n}\n"
+ },
+ "contracts/samples/VerifyingPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"../IPaymaster.sol\";\nimport \"../EntryPoint.sol\";\n\n/**\n * A sample paymaster that uses external service to decide whether to pay for the UserOp.\n * The paymaster trusts an external signer to sign the transaction.\n * The calling user must pass the UserOp to that external signer first, which performs\n * whatever off-chain verification before signing the UserOp.\n * Note that this signature is NOT a replacement for wallet signature:\n * - the paymaster signs to agree to PAY for GAS.\n * - the wallet signs to prove identity and wallet ownership.\n */\ncontract VerifyingPaymaster is IPaymaster {\n\n using UserOperationLib for UserOperation;\n\n EntryPoint public immutable entryPoint;\n address public immutable verifyingSigner;\n\n constructor(EntryPoint _entryPoint, address _verifyingSigner) {\n entryPoint = _entryPoint;\n verifyingSigner = _verifyingSigner;\n }\n\n function addStake() external payable {\n entryPoint.addStake{value : msg.value}(entryPoint.unstakeDelayBlocks());\n }\n\n // verify our external signer signed this request.\n // the \"paymasterData\" is supposed to be a signature over the entire request params\n function verifyPaymasterUserOp(UserOperation calldata userOp, uint requiredPreFund) external view override returns (bytes memory context) {\n (requiredPreFund);\n\n bytes32 hash = userOp.hash();\n require( userOp.paymasterData.length >= 65, \"VerifyingPaymaster: invalid signature length in paymasterData\");\n (bytes32 r, bytes32 s) = abi.decode(userOp.paymasterData, (bytes32, bytes32));\n uint8 v = uint8(userOp.paymasterData[64]);\n require(verifyingSigner == ecrecover(hash, v, r, s), \"VerifyingPaymaster: wrong signature\");\n\n //no other on-chain validation: entire UserOp should have been checked by the external service,\n // prior signing it.\n return \"\";\n }\n\n function postOp(PostOpMode, bytes calldata, uint) external pure override {\n //should never get called. returned \"0\" from verifyPaymasterUserOp\n revert();\n }\n}\n"
+ },
+ "contracts/samples/TokenPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"../IPaymaster.sol\";\nimport \"../EntryPoint.sol\";\nimport \"./SimpleWalletForTokens.sol\";\nimport \"hardhat/console.sol\";\n\n/**\n * A sample paymaster that define itself as a token to pay for gas.\n * The paymaster IS the token to use, since a paymaster cannot use an external contract.\n * also, the exchange rate has to be fixed, since it can't refernce external Uniswap os other exchange contract.\n */\ncontract TokenPaymaster is Ownable, ERC20, IPaymaster {\n\n //calculated cost of the postOp\n uint COST_OF_POST = 3000;\n\n EntryPoint entryPoint;\n bytes32 immutable knownWallet;\n\n constructor(string memory _symbol, EntryPoint _entryPoint) ERC20(_symbol, _symbol) {\n entryPoint = _entryPoint;\n knownWallet = keccak256(type(SimpleWallet).creationCode);\n// knownWallets[keccak256(type(SimpleWallet).creationCode)] = true;\n approve(owner(), type(uint).max);\n }\n\n //helpers for owner, to mint and withdraw tokens.\n function mintTokens(address recipient, uint amount) external onlyOwner {\n _mint(recipient, amount);\n }\n\n //owner should call and put eth into it.\n function addStake() external payable {\n entryPoint.addStake{value : msg.value}(entryPoint.unstakeDelayBlocks());\n }\n\n //TODO: this method assumes a fixed ratio of token-to-eth. should use oracle.\n function ethToToken(uint valueEth) internal pure returns (uint valueToken) {\n return valueEth / 100;\n }\n\n // verify that the user has enough tokens.\n function verifyPaymasterUserOp(UserOperation calldata userOp, uint requiredPreFund) external view override returns (bytes memory context) {\n uint tokenPrefund = ethToToken(requiredPreFund);\n\n if (userOp.initCode.length != 0) {\n bytes32 bytecodeHash = keccak256(userOp.initCode[0:userOp.initCode.length-64]);\n require(knownWallet == bytecodeHash, \"TokenPaymaster: unknown wallet constructor\");\n\n //verify the token constructor params:\n // first param (of 2) should be our entryPoint\n bytes32 entryPointParam = bytes32(userOp.initCode[userOp.initCode.length-64:]);\n require( address(uint160(uint256(entryPointParam))) == address(entryPoint), \"wrong paymaster in constructor\");\n\n //TODO: must also whitelist init function (callData), since that what will call \"token.approve(paymaster)\"\n //no \"allowance\" check during creation (we trust known constructor/init function)\n require(balanceOf(userOp.sender) > tokenPrefund, \"TokenPaymaster: no balance (pre-create)\");\n } else {\n\n require(balanceOf(userOp.sender) > tokenPrefund, \"TokenPaymaster: no balance\");\n }\n\n //since we ARE the token, we don't need approval to _transfer() value from user's balance.\n // if (token.allowance(userOp.sender, address(this)) < tokenPrefund) {\n //\n // //TODO: allowance too low. just before reverting, can check if current operation is \"token.approve(paymaster)\"\n // // this is a multi-step operation: first, verify \"callData\" is exec(token, innerData)\n // // (this requires knowing the \"execute\" signature of the wallet\n // // then verify that \"innerData\" is approve(paymaster,-1)\n // revert(\"TokenPaymaster: no allowance\");\n // }\n return abi.encode(userOp.sender);\n }\n\n //actual charge of user.\n // this method will be called just after the user's TX with postRevert=false.\n // BUT: if the user changed its balance and that postOp reverted, then it gets called again, after reverting\n // the user's TX\n function postOp(PostOpMode mode, bytes calldata context, uint actualGasCost) external override {\n //we don't really care about the mode, we just pay the gas with the user's tokens.\n (mode);\n address sender = abi.decode(context, (address));\n uint charge = ethToToken(actualGasCost + COST_OF_POST);\n //actualGasCost is known to be no larger than the above requiredPreFund, so the transfer should succeed.\n _transfer(sender, address(this), charge);\n }\n}\n"
+ },
+ "@openzeppelin/contracts/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\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 _setOwner(_msgSender());\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 called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\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 _setOwner(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 _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n"
+ },
+ "contracts/samples/SimpleWalletForTokens.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"./SimpleWallet.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n//in order to be created with tokens, the wallet has to have allowance to the paymaster in advance.\n// the simplest strategy is assign the allowance in the constructor or init function\ncontract SimpleWalletForTokens is SimpleWallet {\n\n constructor(EntryPoint _entryPoint, address _owner, IERC20 token, address paymaster) SimpleWallet(_entryPoint, _owner) {\n token.approve(paymaster, type(uint).max);\n }\n}\n"
+ },
+ "@openzeppelin/contracts/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\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"
+ },
+ "@openzeppelin/contracts/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "contracts/samples/SimpleWallet.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"../IWallet.sol\";\nimport \"../EntryPoint.sol\";\n\nimport \"hardhat/console.sol\";\n\n//minimal wallet\n// this is sample minimal wallet.\n// has execute, eth handling methods\n// has a single signer that can send requests through the entryPoint.\ncontract SimpleWallet is IWallet {\n using UserOperationLib for UserOperation;\n struct OwnerNonce {\n uint96 nonce;\n address owner;\n }\n OwnerNonce ownerNonce;\n EntryPoint public entryPoint;\n\n function nonce() public view returns (uint) {\n return ownerNonce.nonce;\n }\n\n function owner() public view returns(address) {\n return ownerNonce.owner;\n }\n\n event EntryPointChanged(EntryPoint oldEntryPoint, EntryPoint newEntryPoint);\n\n receive() external payable {}\n\n constructor(EntryPoint _entryPoint, address _owner) {\n entryPoint = _entryPoint;\n ownerNonce.owner = _owner;\n }\n\n modifier onlyOwner() {\n _onlyOwner();\n _;\n }\n\n function _onlyOwner() internal view {\n //directly from EOA owner, or through the entryPoint (which gets redirected through execFromEntryPoint)\n require(msg.sender == ownerNonce.owner || msg.sender == address(this), \"only owner\");\n }\n\n function transfer(address payable dest, uint amount) external onlyOwner {\n dest.transfer(amount);\n }\n\n function exec(address dest, uint value, bytes calldata func) external onlyOwner {\n _call(dest, value, func);\n }\n\n function updateEntryPoint(EntryPoint _entryPoint) external onlyOwner {\n emit EntryPointChanged(entryPoint, _entryPoint);\n entryPoint = _entryPoint;\n }\n\n function _requireFromEntryPoint() internal view {\n require(msg.sender == address(entryPoint), \"wallet: not from EntryPoint\");\n }\n\n function verifyUserOp(UserOperation calldata userOp, uint requiredPrefund) external override {\n _requireFromEntryPoint();\n _validateSignature(userOp);\n _validateAndIncrementNonce(userOp);\n _payPrefund(requiredPrefund);\n }\n\n function _payPrefund(uint requiredPrefund) internal {\n if (requiredPrefund != 0) {\n (bool success) = payable(msg.sender).send(requiredPrefund);\n (success);\n //ignore failure (its EntryPoint's job to verify, not wallet.)\n }\n }\n\n //called by entryPoint, only after verifyUserOp succeeded.\n function execFromEntryPoint(address dest, uint value, bytes calldata func) external {\n _requireFromEntryPoint();\n _call(dest, value, func);\n }\n\n function _validateAndIncrementNonce(UserOperation calldata userOp) internal {\n //during construction, the \"nonce\" field hold the salt.\n // if we assert it is zero, then we allow only a single wallet per owner.\n if (userOp.initCode.length == 0) {\n require(ownerNonce.nonce++ == userOp.nonce, \"wallet: invalid nonce\");\n }\n }\n\n function _validateSignature(UserOperation calldata userOp) internal view {\n\n bytes32 hash = userOp.hash();\n (bytes32 r, bytes32 s, uint8 v) = _rsv(userOp.signature);\n\n require(owner() == _ecrecover(hash, v, r, s), \"wallet: wrong signature\");\n }\n\n function _rsv(bytes calldata signature) internal pure returns (bytes32 r, bytes32 s, uint8 v) {\n\n require(signature.length == 65, \"wallet: invalid signature length\");\n assembly {\n r := calldataload(signature.offset)\n s := calldataload(add(signature.offset, 0x20))\n v := byte(0, calldataload(add(signature.offset, 0x40)))\n }\n }\n\n function _ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n return ecrecover(hash, v, r, s);\n }\n\n function _call(address sender, uint value, bytes memory data) internal {\n (bool success, bytes memory result) = sender.call{value : value}(data);\n if (!success) {\n assembly {\n revert(result, add(result, 32))\n }\n }\n }\n\n function addDeposit() public payable {\n entryPoint.addDeposit{value : msg.value}();\n }\n\n function withdrawDeposit(address payable withdrawAddress) public {\n entryPoint.withdrawStake(withdrawAddress);\n }\n}\n"
+ },
+ "contracts/samples/TestToken.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract TestToken is ERC20 {\n constructor ()\n ERC20(\"TST\", \"TestToken\") {\n }\n\n function mint(address sender, uint amount) external {\n _mint(sender, amount);\n }\n}\n"
+ },
+ "contracts/test/TestUtil.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"../UserOperation.sol\";\nimport \"../IWallet.sol\";\n\ncontract TestUtil {\n using UserOperationLib for UserOperation;\n\n function packUserOp(UserOperation calldata op) external pure returns (bytes memory){\n return op.pack();\n }\n\n function prefund(UserOperation calldata op) public view returns (uint) {\n return op.requiredPreFund(0);\n }\n\n}"
+ },
+ "contracts/test/TestCounter.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.7;\n\nimport \"../UserOperation.sol\";\nimport \"../IWallet.sol\";\n\n//sample \"receiver\" contract, for testing \"exec\" from wallet.\ncontract TestCounter {\n mapping(address => uint) public counters;\n\n function count() public {\n counters[msg.sender] = counters[msg.sender] + 1;\n\n }\n\n //helper method to waste gas\n // repeat - waste gas on writing storage in a loop\n // junk - dynamic buffer to stress the function size.\n mapping(uint => uint) xxx;\n uint offset;\n\n function gasWaster(uint repeat, string calldata /*junk*/) external {\n for (uint i = 1; i <= repeat; i++) {\n offset++;\n xxx[offset] = i;\n }\n }\n}"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 200
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata",
+ "devdoc",
+ "userdoc",
+ "storageLayout",
+ "evm.gasEstimates"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ },
+ "metadata": {
+ "useLiteralContent": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/.chainId
new file mode 100644
index 000000000..56a6051ca
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/.chainId
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/EntryPoint.json
new file mode 100644
index 000000000..037750fba
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/EntryPoint.json
@@ -0,0 +1,1318 @@
+{
+ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "paid",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bool",
+ "name": "targetSuccess",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetResult",
+ "type": "bytes"
+ }
+ ],
+ "name": "ExecutionResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SenderAddressResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureValidationFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct IEntryPoint.AggregatorStakeInfo",
+ "name": "aggregatorInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResultWithAggregation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "factory",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "AccountDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "BeforeExecution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalDeposit",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposited",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureAggregatorChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStaked",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeLocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasUsed",
+ "type": "uint256"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawn",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "SIG_VALIDATION_FAILED",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ }
+ ],
+ "name": "_validateSenderAndPaymaster",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "depositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "deposits",
+ "outputs": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getDepositInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "internalType": "struct IStakeManager.DepositInfo",
+ "name": "info",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "getUserOpHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "userOps",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "contract IAggregator",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.UserOpsPerAggregator[]",
+ "name": "opsPerAggregator",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleAggregatedOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "incrementNonce",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.MemoryUserOp",
+ "name": "mUserOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "contextOffset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.UserOpInfo",
+ "name": "opInfo",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ }
+ ],
+ "name": "innerHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonceSequenceNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetCallData",
+ "type": "bytes"
+ }
+ ],
+ "name": "simulateHandleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateValidation",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "withdrawAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [],
+ "numDeployments": 2,
+ "solcInputHash": "a4c52f0671aad8941c53d6ead2063803",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://69643e83f68e6a13d5075c7565bfce326673b0bd98c432033c4603ea84835746\",\"dweb:/ipfs/QmSwSzjYyV7qudi5vvsmzHMG2Z4YJZxX51RRXXVCLaNcEU\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ff83c59432e733bf6304dda27cd4b0f34401917dd535e2669cc842d2d26568c\",\"dweb:/ipfs/QmPJbHU5TAjHqUTZzAcicEeG2nknmwCN43L4EW9LHbknTN\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}",
+ "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
+ "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/SimpleAccountFactory.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/SimpleAccountFactory.json
new file mode 100644
index 000000000..4559ec0ad
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/SimpleAccountFactory.json
@@ -0,0 +1,107 @@
+{
+ "address": "0x9406Cc6185a346906296840746125a0E44976454",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "contract IEntryPoint",
+ "name": "_entryPoint",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "accountImplementation",
+ "outputs": [
+ {
+ "internalType": "contract SimpleAccount",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "salt",
+ "type": "uint256"
+ }
+ ],
+ "name": "createAccount",
+ "outputs": [
+ {
+ "internalType": "contract SimpleAccount",
+ "name": "ret",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "salt",
+ "type": "uint256"
+ }
+ ],
+ "name": "getAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "args": [
+ "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"
+ ],
+ "numDeployments": 1,
+ "solcInputHash": "02113a2ed1850c3774563305ee607f11",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"accountImplementation\",\"outputs\":[{\"internalType\":\"contract SimpleAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract SimpleAccount\",\"name\":\"ret\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createAccount(address,uint256)\":{\"notice\":\"create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\"},\"getAddress(address,uint256)\":{\"notice\":\"calculate the counterfactual address of this account as it would be returned by createAccount()\"}},\"notice\":\"A sample factory contract for SimpleAccount A UserOperations \\\"initCode\\\" holds the address of the factory, and a method call (to createAccount, in this sample factory). The factory's createAccount returns the target account address even if it is already installed. This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/samples/SimpleAccountFactory.sol\":\"SimpleAccountFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initialized`\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Internal function that returns the initialized version. Returns `_initializing`\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0xcee5467d5d873fb75dae6f98c01a8d25dd609f9d0374c7d39217bd5f9539a2d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeTo(address newImplementation) external virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\\n *\\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\\n * contract implement this interface (contract holders can be their own\\n * implementer) and registering it on the\\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\\n *\\n * See {IERC1820Registry} and {ERC1820Implementer}.\\n */\\ninterface IERC777Recipient {\\n /**\\n * @dev Called by an {IERC777} token contract whenever tokens are being\\n * moved or created into a registered account (`to`). The type of operation\\n * is conveyed by `from` being the zero address or not.\\n *\\n * This call occurs _after_ the token contract's state is updated, so\\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\\n *\\n * This function may revert to prevent the operation from being executed.\\n */\\n function tokensReceived(\\n address operator,\\n address from,\\n address to,\\n uint256 amount,\\n bytes calldata userData,\\n bytes calldata operatorData\\n ) external;\\n}\\n\",\"keccak256\":\"0x1a5d61db2733202ba361e6d6741cd2e662380e22b80e987eacfc91973f2267dc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/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\"},\"@openzeppelin/contracts/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\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/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\"},\"@openzeppelin/contracts/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\"},\"@openzeppelin/contracts/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\"},\"@openzeppelin/contracts/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\"},\"contracts/core/BaseAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"../interfaces/IAccount.sol\\\";\\nimport \\\"../interfaces/IEntryPoint.sol\\\";\\nimport \\\"./Helpers.sol\\\";\\n\\n/**\\n * Basic account implementation.\\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\\n * specific account implementation should inherit it and provide the account-specific logic\\n */\\nabstract contract BaseAccount is IAccount {\\n using UserOperationLib for UserOperation;\\n\\n //return value in case of signature failure, with no time-range.\\n // equivalent to _packValidationData(true,0,0);\\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\\n\\n /**\\n * Return the account nonce.\\n * This method returns the next sequential nonce.\\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\\n */\\n function getNonce() public view virtual returns (uint256) {\\n return entryPoint().getNonce(address(this), 0);\\n }\\n\\n /**\\n * return the entryPoint used by this account.\\n * subclass should return the current entryPoint used by this account.\\n */\\n function entryPoint() public view virtual returns (IEntryPoint);\\n\\n /**\\n * Validate user's signature and nonce.\\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external override virtual returns (uint256 validationData) {\\n _requireFromEntryPoint();\\n validationData = _validateSignature(userOp, userOpHash);\\n _validateNonce(userOp.nonce);\\n _payPrefund(missingAccountFunds);\\n }\\n\\n /**\\n * ensure the request comes from the known entrypoint.\\n */\\n function _requireFromEntryPoint() internal virtual view {\\n require(msg.sender == address(entryPoint()), \\\"account: not from EntryPoint\\\");\\n }\\n\\n /**\\n * validate the signature is valid for this message.\\n * @param userOp validate the userOp.signature field\\n * @param userOpHash convenient field: the hash of the request, to check the signature against\\n * (also hashes the entrypoint and chain id)\\n * @return validationData signature and time-range of this operation\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal virtual returns (uint256 validationData);\\n\\n /**\\n * Validate the nonce of the UserOperation.\\n * This method may validate the nonce requirement of this account.\\n * e.g.\\n * To limit the nonce to use sequenced UserOps only (no \\\"out of order\\\" UserOps):\\n * `require(nonce < type(uint64).max)`\\n * For a hypothetical account that *requires* the nonce to be out-of-order:\\n * `require(nonce & type(uint64).max == 0)`\\n *\\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\\n * action is needed by the account itself.\\n *\\n * @param nonce to validate\\n *\\n * solhint-disable-next-line no-empty-blocks\\n */\\n function _validateNonce(uint256 nonce) internal view virtual {\\n }\\n\\n /**\\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\\n * subclass MAY override this method for better funds management\\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\\n * it will not be required to send again)\\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\\n */\\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\\n if (missingAccountFunds != 0) {\\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\\\"\\\");\\n (success);\\n //ignore failure (its EntryPoint's job to verify, not account.)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5eb3253b32fd8ba8ae7b9d83da8e9924254a4d3d17a8772b41280e8572974b3c\",\"license\":\"GPL-3.0\"},\"contracts/core/Helpers.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\n/**\\n * returned data from validateUserOp.\\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\\n * @param aggregator - address(0) - the account validated the signature by itself.\\n * address(1) - the account failed to validate the signature.\\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\\n * @param validAfter - this UserOp is valid only after this timestamp.\\n * @param validaUntil - this UserOp is valid only up to this timestamp.\\n */\\n struct ValidationData {\\n address aggregator;\\n uint48 validAfter;\\n uint48 validUntil;\\n }\\n\\n//extract sigFailed, validAfter, validUntil.\\n// also convert zero validUntil to type(uint48).max\\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\\n address aggregator = address(uint160(validationData));\\n uint48 validUntil = uint48(validationData >> 160);\\n if (validUntil == 0) {\\n validUntil = type(uint48).max;\\n }\\n uint48 validAfter = uint48(validationData >> (48 + 160));\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n// intersect account and paymaster ranges.\\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\\n ValidationData memory accountValidationData = _parseValidationData(validationData);\\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\\n address aggregator = accountValidationData.aggregator;\\n if (aggregator == address(0)) {\\n aggregator = pmValidationData.aggregator;\\n }\\n uint48 validAfter = accountValidationData.validAfter;\\n uint48 validUntil = accountValidationData.validUntil;\\n uint48 pmValidAfter = pmValidationData.validAfter;\\n uint48 pmValidUntil = pmValidationData.validUntil;\\n\\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\\n return ValidationData(aggregator, validAfter, validUntil);\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp\\n * @param data - the ValidationData to pack\\n */\\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\\n }\\n\\n/**\\n * helper to pack the return value for validateUserOp, when not using an aggregator\\n * @param sigFailed - true for signature failure, false for success\\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\\n * @param validAfter first timestamp this UserOperation is valid\\n */\\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\\n }\\n\\n/**\\n * keccak function over calldata.\\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\\n */\\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\\n assembly {\\n let mem := mload(0x40)\\n let len := data.length\\n calldatacopy(mem, data.offset, len)\\n ret := keccak256(mem, len)\\n }\\n }\\n\\n\",\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\ninterface IAccount {\\n\\n /**\\n * Validate user's signature and nonce\\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\\n * This allows making a \\\"simulation call\\\" without a valid signature\\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\\n *\\n * @dev Must validate caller is the entryPoint.\\n * Must validate the signature and nonce\\n * @param userOp the operation that is about to be executed.\\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\\n * The excess is left as a deposit in the entrypoint, for future calls.\\n * can be withdrawn anytime using \\\"entryPoint.withdrawTo()\\\"\\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\\n * otherwise, an address of an \\\"authorizer\\\" contract.\\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \\\"indefinite\\\"\\n * <6-byte> validAfter - first timestamp this operation is valid\\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\\n */\\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\\n external returns (uint256 validationData);\\n}\\n\",\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAggregator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./UserOperation.sol\\\";\\n\\n/**\\n * Aggregated Signatures validator.\\n */\\ninterface IAggregator {\\n\\n /**\\n * validate aggregated signature.\\n * revert if the aggregated signature does not match the given list of operations.\\n */\\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\\n\\n /**\\n * validate signature of a single userOp\\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\\n * @param userOp the userOperation received from the user.\\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\\n * (usually empty, unless account and aggregator support some kind of \\\"multisig\\\"\\n */\\n function validateUserOpSignature(UserOperation calldata userOp)\\n external view returns (bytes memory sigForUserOp);\\n\\n /**\\n * aggregate multiple signatures into a single value.\\n * This method is called off-chain to calculate the signature to pass with handleOps()\\n * bundler MAY use optimized custom code perform this aggregation\\n * @param userOps array of UserOperations to collect the signatures from.\\n * @return aggregatedSignature the aggregated signature\\n */\\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\\n}\\n\",\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IEntryPoint.sol\":{\"content\":\"/**\\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\\n ** Only one instance required on each chain.\\n **/\\n// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"./UserOperation.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\nimport \\\"./IAggregator.sol\\\";\\nimport \\\"./INonceManager.sol\\\";\\n\\ninterface IEntryPoint is IStakeManager, INonceManager {\\n\\n /***\\n * An event emitted after each successful request\\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\\n * @param sender - the account that generates this request.\\n * @param paymaster - if non-null, the paymaster that pays for this request.\\n * @param nonce - the nonce value from the request.\\n * @param success - true if the sender transaction succeeded, false if reverted.\\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\\n */\\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\\n\\n /**\\n * account \\\"sender\\\" was deployed.\\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\\n * @param sender the account that is deployed\\n * @param factory the factory used to deploy this account (in the initCode)\\n * @param paymaster the paymaster used by this UserOp\\n */\\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\\n\\n /**\\n * An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\\n * @param userOpHash the request unique identifier.\\n * @param sender the sender of this request\\n * @param nonce the nonce used in the request\\n * @param revertReason - the return bytes from the (reverted) call to \\\"callData\\\".\\n */\\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\\n\\n /**\\n * an event emitted by handleOps(), before starting the execution loop.\\n * any event emitted before this event, is part of the validation.\\n */\\n event BeforeExecution();\\n\\n /**\\n * signature aggregator used by the following UserOperationEvents within this bundle.\\n */\\n event SignatureAggregatorChanged(address indexed aggregator);\\n\\n /**\\n * a custom revert error of handleOps, to identify the offending op.\\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\\n * @param reason - revert reason\\n * The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues,\\n * so a failure can be attributed to the correct entity.\\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\\n */\\n error FailedOp(uint256 opIndex, string reason);\\n\\n /**\\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\\n */\\n error SignatureValidationFailed(address aggregator);\\n\\n /**\\n * Successful result from simulateValidation.\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n */\\n error ValidationResult(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\\n\\n /**\\n * Successful result from simulateValidation, if the account returns a signature aggregator\\n * @param returnInfo gas and time-range returned values\\n * @param senderInfo stake information about the sender\\n * @param factoryInfo stake information about the factory (if any)\\n * @param paymasterInfo stake information about the paymaster (if any)\\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\\n * bundler MUST use it to verify the signature, or reject the UserOperation\\n */\\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\\n AggregatorStakeInfo aggregatorInfo);\\n\\n /**\\n * return value of getSenderAddress\\n */\\n error SenderAddressResult(address sender);\\n\\n /**\\n * return value of simulateHandleOp\\n */\\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\\n\\n //UserOps handled, per aggregator\\n struct UserOpsPerAggregator {\\n UserOperation[] userOps;\\n\\n // aggregator address\\n IAggregator aggregator;\\n // aggregated signature\\n bytes signature;\\n }\\n\\n /**\\n * Execute a batch of UserOperation.\\n * no signature aggregator is used.\\n * if any account requires an aggregator (that is, it returned an aggregator when\\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\\n * @param ops the operations to execute\\n * @param beneficiary the address to receive the fees\\n */\\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\\n\\n /**\\n * Execute a batch of UserOperation with Aggregators\\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\\n * @param beneficiary the address to receive the fees\\n */\\n function handleAggregatedOps(\\n UserOpsPerAggregator[] calldata opsPerAggregator,\\n address payable beneficiary\\n ) external;\\n\\n /**\\n * generate a request Id - unique identifier for this request.\\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\\n */\\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\\n\\n /**\\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\\n * @param userOp the user operation to validate.\\n */\\n function simulateValidation(UserOperation calldata userOp) external;\\n\\n /**\\n * gas and return values during simulation\\n * @param preOpGas the gas used for validation (including preValidationGas)\\n * @param prefund the required prefund for this operation\\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\\n */\\n struct ReturnInfo {\\n uint256 preOpGas;\\n uint256 prefund;\\n bool sigFailed;\\n uint48 validAfter;\\n uint48 validUntil;\\n bytes paymasterContext;\\n }\\n\\n /**\\n * returned aggregated signature info.\\n * the aggregator returned by the account, and its current stake.\\n */\\n struct AggregatorStakeInfo {\\n address aggregator;\\n StakeInfo stakeInfo;\\n }\\n\\n /**\\n * Get counterfactual sender address.\\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\\n * this method always revert, and returns the address in SenderAddressResult error\\n * @param initCode the constructor code to be passed into the UserOperation.\\n */\\n function getSenderAddress(bytes memory initCode) external;\\n\\n\\n /**\\n * simulate full execution of a UserOperation (including both validation and target execution)\\n * this method will always revert with \\\"ExecutionResult\\\".\\n * it performs full validation of the UserOperation, but ignores signature error.\\n * an optional target address is called after the userop succeeds, and its value is returned\\n * (before the entire call is reverted)\\n * Note that in order to collect the the success/failure of the target call, it must be executed\\n * with trace enabled to track the emitted events.\\n * @param op the UserOperation to simulate\\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\\n * are set to the return from that call.\\n * @param targetCallData callData to pass to target address\\n */\\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\\n}\\n\\n\",\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/INonceManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\ninterface INonceManager {\\n\\n /**\\n * Return the next nonce for this sender.\\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\\n * But UserOp with different keys can come with arbitrary order.\\n *\\n * @param sender the account address\\n * @param key the high 192 bit of the nonce\\n * @return nonce a full nonce to pass for next UserOp with this sender.\\n */\\n function getNonce(address sender, uint192 key)\\n external view returns (uint256 nonce);\\n\\n /**\\n * Manually increment the nonce of the sender.\\n * This method is exposed just for completeness..\\n * Account does NOT need to call it, neither during validation, nor elsewhere,\\n * as the EntryPoint will update the nonce regardless.\\n * Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future\\n * UserOperations will not pay extra for the first transaction with a given key.\\n */\\n function incrementNonce(uint192 key) external;\\n}\\n\",\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.12;\\n\\n/**\\n * manage deposits and stakes.\\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\\n * stake is value locked for at least \\\"unstakeDelay\\\" by the staked entity.\\n */\\ninterface IStakeManager {\\n\\n event Deposited(\\n address indexed account,\\n uint256 totalDeposit\\n );\\n\\n event Withdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /// Emitted when stake or unstake delay are modified\\n event StakeLocked(\\n address indexed account,\\n uint256 totalStaked,\\n uint256 unstakeDelaySec\\n );\\n\\n /// Emitted once a stake is scheduled for withdrawal\\n event StakeUnlocked(\\n address indexed account,\\n uint256 withdrawTime\\n );\\n\\n event StakeWithdrawn(\\n address indexed account,\\n address withdrawAddress,\\n uint256 amount\\n );\\n\\n /**\\n * @param deposit the entity's deposit\\n * @param staked true if this entity is staked.\\n * @param stake actual amount of ether staked for this entity.\\n * @param unstakeDelaySec minimum delay to withdraw the stake.\\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\\n * and the rest fit into a 2nd cell.\\n * 112 bit allows for 10^15 eth\\n * 48 bit for full timestamp\\n * 32 bit allows 150 years for unstake delay\\n */\\n struct DepositInfo {\\n uint112 deposit;\\n bool staked;\\n uint112 stake;\\n uint32 unstakeDelaySec;\\n uint48 withdrawTime;\\n }\\n\\n //API struct used by getStakeInfo and simulateValidation\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelaySec;\\n }\\n\\n /// @return info - full deposit information of given account\\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\\n\\n /// @return the deposit (for gas payment) of the account\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * add to the deposit of the given account\\n */\\n function depositTo(address account) external payable;\\n\\n /**\\n * add to the account's stake - amount and delay\\n * any pending unstake is first cancelled.\\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\\n */\\n function addStake(uint32 _unstakeDelaySec) external payable;\\n\\n /**\\n * attempt to unlock the stake.\\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\\n */\\n function unlockStake() external;\\n\\n /**\\n * withdraw from the (unlocked) stake.\\n * must first call unlockStake and wait for the unstakeDelay to pass\\n * @param withdrawAddress the address to send withdrawn value.\\n */\\n function withdrawStake(address payable withdrawAddress) external;\\n\\n /**\\n * withdraw from the deposit.\\n * @param withdrawAddress the address to send withdrawn value.\\n * @param withdrawAmount the amount to withdraw.\\n */\\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\\n}\\n\",\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/UserOperation.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-inline-assembly */\\n\\nimport {calldataKeccak} from \\\"../core/Helpers.sol\\\";\\n\\n/**\\n * User Operation struct\\n * @param sender the sender account of this request.\\n * @param nonce unique value the sender uses to verify it is not a replay.\\n * @param initCode if set, the account contract will be created by this constructor/\\n * @param callData the method call to execute on this account.\\n * @param callGasLimit the gas limit passed to the callData method call.\\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\\n * @param maxFeePerGas same as EIP-1559 gas parameter.\\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\\n */\\n struct UserOperation {\\n\\n address sender;\\n uint256 nonce;\\n bytes initCode;\\n bytes callData;\\n uint256 callGasLimit;\\n uint256 verificationGasLimit;\\n uint256 preVerificationGas;\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n bytes paymasterAndData;\\n bytes signature;\\n }\\n\\n/**\\n * Utility functions helpful when working with UserOperation structs.\\n */\\nlibrary UserOperationLib {\\n\\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\\n address data;\\n //read sender from userOp, which is first userOp member (saves 800 gas...)\\n assembly {data := calldataload(userOp)}\\n return address(uint160(data));\\n }\\n\\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\\n // pay above what he signed for.\\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\\n unchecked {\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n if (maxFeePerGas == maxPriorityFeePerGas) {\\n //legacy mode (for networks that don't support basefee opcode)\\n return maxFeePerGas;\\n }\\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\\n }\\n }\\n\\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\\n address sender = getSender(userOp);\\n uint256 nonce = userOp.nonce;\\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\\n bytes32 hashCallData = calldataKeccak(userOp.callData);\\n uint256 callGasLimit = userOp.callGasLimit;\\n uint256 verificationGasLimit = userOp.verificationGasLimit;\\n uint256 preVerificationGas = userOp.preVerificationGas;\\n uint256 maxFeePerGas = userOp.maxFeePerGas;\\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\\n\\n return abi.encode(\\n sender, nonce,\\n hashInitCode, hashCallData,\\n callGasLimit, verificationGasLimit, preVerificationGas,\\n maxFeePerGas, maxPriorityFeePerGas,\\n hashPaymasterAndData\\n );\\n }\\n\\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\\n return keccak256(pack(userOp));\\n }\\n\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n}\\n\",\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccount.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable avoid-low-level-calls */\\n/* solhint-disable no-inline-assembly */\\n/* solhint-disable reason-string */\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\n\\nimport \\\"../core/BaseAccount.sol\\\";\\nimport \\\"./callback/TokenCallbackHandler.sol\\\";\\n\\n/**\\n * minimal account.\\n * this is sample minimal account.\\n * has execute, eth handling methods\\n * has a single signer that can send requests through the entryPoint.\\n */\\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\\n using ECDSA for bytes32;\\n\\n address public owner;\\n\\n IEntryPoint private immutable _entryPoint;\\n\\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\\n\\n modifier onlyOwner() {\\n _onlyOwner();\\n _;\\n }\\n\\n /// @inheritdoc BaseAccount\\n function entryPoint() public view virtual override returns (IEntryPoint) {\\n return _entryPoint;\\n }\\n\\n\\n // solhint-disable-next-line no-empty-blocks\\n receive() external payable {}\\n\\n constructor(IEntryPoint anEntryPoint) {\\n _entryPoint = anEntryPoint;\\n _disableInitializers();\\n }\\n\\n function _onlyOwner() internal view {\\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\\n require(msg.sender == owner || msg.sender == address(this), \\\"only owner\\\");\\n }\\n\\n /**\\n * execute a transaction (called directly from owner, or by entryPoint)\\n */\\n function execute(address dest, uint256 value, bytes calldata func) external {\\n _requireFromEntryPointOrOwner();\\n _call(dest, value, func);\\n }\\n\\n /**\\n * execute a sequence of transactions\\n */\\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\\n _requireFromEntryPointOrOwner();\\n require(dest.length == func.length, \\\"wrong array lengths\\\");\\n for (uint256 i = 0; i < dest.length; i++) {\\n _call(dest[i], 0, func[i]);\\n }\\n }\\n\\n /**\\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\\n * the implementation by calling `upgradeTo()`\\n */\\n function initialize(address anOwner) public virtual initializer {\\n _initialize(anOwner);\\n }\\n\\n function _initialize(address anOwner) internal virtual {\\n owner = anOwner;\\n emit SimpleAccountInitialized(_entryPoint, owner);\\n }\\n\\n // Require the function call went through EntryPoint or owner\\n function _requireFromEntryPointOrOwner() internal view {\\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \\\"account: not Owner or EntryPoint\\\");\\n }\\n\\n /// implement template method of BaseAccount\\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\\n internal override virtual returns (uint256 validationData) {\\n bytes32 hash = userOpHash.toEthSignedMessageHash();\\n if (owner != hash.recover(userOp.signature))\\n return SIG_VALIDATION_FAILED;\\n return 0;\\n }\\n\\n function _call(address target, uint256 value, bytes memory data) internal {\\n (bool success, bytes memory result) = target.call{value : value}(data);\\n if (!success) {\\n assembly {\\n revert(add(result, 32), mload(result))\\n }\\n }\\n }\\n\\n /**\\n * check current account deposit in the entryPoint\\n */\\n function getDeposit() public view returns (uint256) {\\n return entryPoint().balanceOf(address(this));\\n }\\n\\n /**\\n * deposit more funds for this account in the entryPoint\\n */\\n function addDeposit() public payable {\\n entryPoint().depositTo{value : msg.value}(address(this));\\n }\\n\\n /**\\n * withdraw value from the account's deposit\\n * @param withdrawAddress target to send to\\n * @param amount to withdraw\\n */\\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\\n entryPoint().withdrawTo(withdrawAddress, amount);\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal view override {\\n (newImplementation);\\n _onlyOwner();\\n }\\n}\\n\\n\",\"keccak256\":\"0x295bb73ecafb78a11e7418cc91d5f3c7f5fd5b2eba5e063d1e7d6bb6163192d4\",\"license\":\"GPL-3.0\"},\"contracts/samples/SimpleAccountFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/utils/Create2.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\nimport \\\"./SimpleAccount.sol\\\";\\n\\n/**\\n * A sample factory contract for SimpleAccount\\n * A UserOperations \\\"initCode\\\" holds the address of the factory, and a method call (to createAccount, in this sample factory).\\n * The factory's createAccount returns the target account address even if it is already installed.\\n * This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.\\n */\\ncontract SimpleAccountFactory {\\n SimpleAccount public immutable accountImplementation;\\n\\n constructor(IEntryPoint _entryPoint) {\\n accountImplementation = new SimpleAccount(_entryPoint);\\n }\\n\\n /**\\n * create an account, and return its address.\\n * returns the address even if the account is already deployed.\\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\\n */\\n function createAccount(address owner,uint256 salt) public returns (SimpleAccount ret) {\\n address addr = getAddress(owner, salt);\\n uint codeSize = addr.code.length;\\n if (codeSize > 0) {\\n return SimpleAccount(payable(addr));\\n }\\n ret = SimpleAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\\n address(accountImplementation),\\n abi.encodeCall(SimpleAccount.initialize, (owner))\\n )));\\n }\\n\\n /**\\n * calculate the counterfactual address of this account as it would be returned by createAccount()\\n */\\n function getAddress(address owner,uint256 salt) public view returns (address) {\\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\\n type(ERC1967Proxy).creationCode,\\n abi.encode(\\n address(accountImplementation),\\n abi.encodeCall(SimpleAccount.initialize, (owner))\\n )\\n )));\\n }\\n}\\n\",\"keccak256\":\"0xf2cb4f3889e79edb11aab8d8451e379691813fc6b945ca0b5c3a08017c27b5ed\",\"license\":\"GPL-3.0\"},\"contracts/samples/callback/TokenCallbackHandler.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\n/* solhint-disable no-empty-blocks */\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * Token callback handler.\\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\\n */\\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\\n function tokensReceived(\\n address,\\n address,\\n address,\\n uint256,\\n bytes calldata,\\n bytes calldata\\n ) external pure override {\\n }\\n\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC721Receiver.onERC721Received.selector;\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata,\\n uint256[] calldata,\\n bytes calldata\\n ) external pure override returns (bytes4) {\\n return IERC1155Receiver.onERC1155BatchReceived.selector;\\n }\\n\\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\\n return\\n interfaceId == type(IERC721Receiver).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xfff3df5f5211d71158bb017ff791dc4fa85db53890f7bd72bac3a43d89e83752\",\"license\":\"GPL-3.0\"}},\"version\":1}",
+ "bytecode": "0x60a060405234801561001057600080fd5b5060405161336238038061336283398101604081905261002f91610088565b8060405161003c9061007b565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b0316608052506100b8565b6125dc80610d8683390190565b60006020828403121561009a57600080fd5b81516001600160a01b03811681146100b157600080fd5b9392505050565b608051610ca66100e060003960008181604b0152818161011401526102580152610ca66000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe146100465780635fbfb9cf146100965780638cb84e18146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461039d565b6100bc565b61006d6100b736600461039d565b6101ee565b6000806100c984846101ee565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101e8565b60405173ffffffffffffffffffffffffffffffffffffffff8616602482015284907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052516101b790610390565b6101c2929190610412565b8190604051809103906000f59050801580156101e2573d6000803e3d6000fd5b50925050505b92915050565b60006103578260001b6040518060200161020790610390565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905273ffffffffffffffffffffffffffffffffffffffff871660248201527f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052905161030093929101610412565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261033c9291602001610480565b6040516020818303038152906040528051906020012061035e565b9392505050565b60006103578383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c1806104b083390190565b600080604083850312156103b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146103d457600080fd5b946020939093013593505050565b60005b838110156103fd5781810151838201526020016103e5565b8381111561040c576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000825180604084015261044d8160608501602087016103e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104928184602088016103e2565b8351908301906104a68183602088016103e2565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201cd78ab6a31213989661cff2d7d05fc9b9c38b1a848e8249e2e398659a9eb7e364736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122070aa03035a81441673770173c347020a4af1bf8f651ceebc066752c059bdbac764736f6c634300080f003360c0604052306080523480156200001557600080fd5b50604051620025dc380380620025dc833981016040819052620000389162000118565b6001600160a01b03811660a0526200004f62000056565b506200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161241f620001bd6000396000818161032f015281816108810152818161092801528181610d4c01528181610f9d01528181610fe40152818161133601526115f501526000818161066b0152818161071b015281816109ec01528181610a9c0152610be5015261241f6000f3fe60806040526004361061012c5760003560e01c806352d1902d116100a5578063bc197c8111610074578063c4d66de811610059578063c4d66de8146103d0578063d087d288146103f0578063f23a6e611461040557600080fd5b8063bc197c8114610373578063c399ec88146103bb57600080fd5b806352d1902d146102b35780638da5cb5b146102c8578063b0d691fe14610320578063b61d27f61461035357600080fd5b80633659cfe6116100fc5780634a58db19116100e15780634a58db19146102785780634d44560d146102805780634f1ef286146102a057600080fd5b80633659cfe61461022a5780633a871cdd1461024a57600080fd5b806223de291461013857806301ffc9a71461015f578063150b7a021461019457806318dfb3c71461020a57600080fd5b3661013357005b600080fd5b34801561014457600080fd5b5061015d610153366004611cbf565b5050505050505050565b005b34801561016b57600080fd5b5061017f61017a366004611d70565b61044b565b60405190151581526020015b60405180910390f35b3480156101a057600080fd5b506101d96101af366004611db2565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161018b565b34801561021657600080fd5b5061015d610225366004611e6a565b610530565b34801561023657600080fd5b5061015d610245366004611ed6565b610654565b34801561025657600080fd5b5061026a610265366004611ef3565b610859565b60405190815260200161018b565b61015d61087f565b34801561028c57600080fd5b5061015d61029b366004611f47565b61091e565b61015d6102ae366004611fa2565b6109d5565b3480156102bf57600080fd5b5061026a610bcb565b3480156102d457600080fd5b506000546102fb9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018b565b34801561032c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102fb565b34801561035f57600080fd5b5061015d61036e366004612084565b610cb7565b34801561037f57600080fd5b506101d961038e3660046120d4565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156103c757600080fd5b5061026a610d06565b3480156103dc57600080fd5b5061015d6103eb366004611ed6565b610dbd565b3480156103fc57600080fd5b5061026a610f50565b34801561041157600080fd5b506101d9610420366004612172565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806104de57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061052a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610538610fcc565b8281146105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b60005b8381101561064d5761063b8585838181106105c6576105c66121ee565b90506020020160208101906105db9190611ed6565b60008585858181106105ef576105ef6121ee565b9050602002810190610601919061221d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061109592505050565b8061064581612282565b9150506105a9565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161059d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661078e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161059d565b61083a81611112565b604080516000808252602082019092526108569183919061111a565b50565b600061086361131e565b61086d84846113bd565b9050610878826114a3565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b15801561090a57600080fd5b505af115801561064d573d6000803e3d6000fd5b61092661150e565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b1580156109b957600080fd5b505af11580156109cd573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610a9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c0000000000000000000000000000000000000000606482015260840161059d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b0f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f78790000000000000000000000000000000000000000606482015260840161059d565b610bbb82611112565b610bc78282600161111a565b5050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161059d565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610cbf610fcc565b610d00848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061109592505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db891906122e1565b905090565b600054610100900460ff1615808015610ddd5750600054600160ff909116105b80610df75750303b158015610df7575060005460ff166001145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161059d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ee157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610eea8261159f565b8015610bc757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610d77565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061102d575060005462010000900473ffffffffffffffffffffffffffffffffffffffff1633145b611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e74604482015260640161059d565b565b6000808473ffffffffffffffffffffffffffffffffffffffff1684846040516110be9190612326565b60006040518083038185875af1925050503d80600081146110fb576040519150601f19603f3d011682016040523d82523d6000602084013e611100565b606091505b50915091508161064d57805160208201fd5b61085661150e565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156111525761114d8361163e565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111d7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526111d4918101906122e1565b60015b611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f742055555053000000000000000000000000000000000000606482015260840161059d565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c65555549440000000000000000000000000000000000000000000000606482015260840161059d565b5061114d838383611748565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e7400000000604482015260640161059d565b600080611417836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905061146761142a61014086018661221d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859392505061176d9050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461149957600191505061052a565b5060009392505050565b80156108565760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d806000811461064d576040519150601f19603f3d011682016040523d82523d6000602084013e61064d565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148061153957503330145b611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c79206f776e657200000000000000000000000000000000000000000000604482015260640161059d565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8481168202929092178084556040519190048216927f0000000000000000000000000000000000000000000000000000000000000000909216917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de91a350565b73ffffffffffffffffffffffffffffffffffffffff81163b6116e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161059d565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61175183611791565b60008251118061175e5750805b1561114d57610d0083836117de565b600080600061177c8585611803565b9150915061178981611848565b509392505050565b61179a8161163e565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061087883836040518060600160405280602781526020016123c3602791396119fb565b60008082516041036118395760208301516040840151606085015160001a61182d87828585611a80565b94509450505050611841565b506000905060025b9250929050565b600081600481111561185c5761185c612342565b036118645750565b600181600481111561187857611878612342565b036118df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161059d565b60028160048111156118f3576118f3612342565b0361195a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161059d565b600381600481111561196e5761196e612342565b03610856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161059d565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051611a259190612326565b600060405180830381855af49150503d8060008114611a60576040519150601f19603f3d011682016040523d82523d6000602084013e611a65565b606091505b5091509150611a7686838387611b6f565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611ab75750600090506003611b66565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611b0b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611b5f57600060019250925050611b66565b9150600090505b94509492505050565b60608315611c05578251600003611bfe5773ffffffffffffffffffffffffffffffffffffffff85163b611bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161059d565b5081611c0f565b611c0f8383611c17565b949350505050565b815115611c275781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059d9190612371565b73ffffffffffffffffffffffffffffffffffffffff8116811461085657600080fd5b60008083601f840112611c8f57600080fd5b50813567ffffffffffffffff811115611ca757600080fd5b60208301915083602082850101111561184157600080fd5b60008060008060008060008060c0898b031215611cdb57600080fd5b8835611ce681611c5b565b97506020890135611cf681611c5b565b96506040890135611d0681611c5b565b955060608901359450608089013567ffffffffffffffff80821115611d2a57600080fd5b611d368c838d01611c7d565b909650945060a08b0135915080821115611d4f57600080fd5b50611d5c8b828c01611c7d565b999c989b5096995094979396929594505050565b600060208284031215611d8257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461087857600080fd5b600080600080600060808688031215611dca57600080fd5b8535611dd581611c5b565b94506020860135611de581611c5b565b935060408601359250606086013567ffffffffffffffff811115611e0857600080fd5b611e1488828901611c7d565b969995985093965092949392505050565b60008083601f840112611e3757600080fd5b50813567ffffffffffffffff811115611e4f57600080fd5b6020830191508360208260051b850101111561184157600080fd5b60008060008060408587031215611e8057600080fd5b843567ffffffffffffffff80821115611e9857600080fd5b611ea488838901611e25565b90965094506020870135915080821115611ebd57600080fd5b50611eca87828801611e25565b95989497509550505050565b600060208284031215611ee857600080fd5b813561087881611c5b565b600080600060608486031215611f0857600080fd5b833567ffffffffffffffff811115611f1f57600080fd5b84016101608187031215611f3257600080fd5b95602085013595506040909401359392505050565b60008060408385031215611f5a57600080fd5b8235611f6581611c5b565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215611fb557600080fd5b8235611fc081611c5b565b9150602083013567ffffffffffffffff80821115611fdd57600080fd5b818501915085601f830112611ff157600080fd5b81358181111561200357612003611f73565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561204957612049611f73565b8160405282815288602084870101111561206257600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806000806060858703121561209a57600080fd5b84356120a581611c5b565b935060208501359250604085013567ffffffffffffffff8111156120c857600080fd5b611eca87828801611c7d565b60008060008060008060008060a0898b0312156120f057600080fd5b88356120fb81611c5b565b9750602089013561210b81611c5b565b9650604089013567ffffffffffffffff8082111561212857600080fd5b6121348c838d01611e25565b909850965060608b013591508082111561214d57600080fd5b6121598c838d01611e25565b909650945060808b0135915080821115611d4f57600080fd5b60008060008060008060a0878903121561218b57600080fd5b863561219681611c5b565b955060208701356121a681611c5b565b94506040870135935060608701359250608087013567ffffffffffffffff8111156121d057600080fd5b6121dc89828a01611c7d565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261225257600080fd5b83018035915067ffffffffffffffff82111561226d57600080fd5b60200191503681900382131561184157600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036122da577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b6000602082840312156122f357600080fd5b5051919050565b60005b838110156123155781810151838201526020016122fd565b83811115610d005750506000910152565b600082516123388184602087016122fa565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208152600082518060208401526123908160408501602087016122fa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e7edcd8c7b9333c2bbdd5f8fa69f1cd2cb0f5cbfa76648b9830bcf0cbfef288e64736f6c634300080f0033",
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe146100465780635fbfb9cf146100965780638cb84e18146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461039d565b6100bc565b61006d6100b736600461039d565b6101ee565b6000806100c984846101ee565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101e8565b60405173ffffffffffffffffffffffffffffffffffffffff8616602482015284907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052516101b790610390565b6101c2929190610412565b8190604051809103906000f59050801580156101e2573d6000803e3d6000fd5b50925050505b92915050565b60006103578260001b6040518060200161020790610390565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905273ffffffffffffffffffffffffffffffffffffffff871660248201527f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052905161030093929101610412565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261033c9291602001610480565b6040516020818303038152906040528051906020012061035e565b9392505050565b60006103578383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6107c1806104b083390190565b600080604083850312156103b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146103d457600080fd5b946020939093013593505050565b60005b838110156103fd5781810151838201526020016103e5565b8381111561040c576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000825180604084015261044d8160608501602087016103e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104928184602088016103e2565b8351908301906104a68183602088016103e2565b0194935050505056fe60806040526040516107c13803806107c183398101604081905261002291610321565b61002e82826000610035565b505061043e565b61003e8361006b565b60008251118061004b5750805b156100665761006483836100ab60201b6100291760201c565b505b505050565b610074816100d7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100d0838360405180606001604052806027815260200161079a602791396101a9565b9392505050565b6100ea8161022260201b6100551760201c565b6101515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101887f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61023160201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080856001600160a01b0316856040516101c691906103ef565b600060405180830381855af49150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b50909250905061021886838387610234565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102a357825160000361029c576001600160a01b0385163b61029c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610148565b50816102ad565b6102ad83836102b5565b949350505050565b8151156102c55781518083602001fd5b8060405162461bcd60e51b8152600401610148919061040b565b634e487b7160e01b600052604160045260246000fd5b60005b838110156103105781810151838201526020016102f8565b838111156100645750506000910152565b6000806040838503121561033457600080fd5b82516001600160a01b038116811461034b57600080fd5b60208401519092506001600160401b038082111561036857600080fd5b818501915085601f83011261037c57600080fd5b81518181111561038e5761038e6102df565b604051601f8201601f19908116603f011681019083821181831017156103b6576103b66102df565b816040528281528860208487010111156103cf57600080fd5b6103e08360208301602088016102f5565b80955050505050509250929050565b600082516104018184602087016102f5565b9190910192915050565b602081526000825180602084015261042a8160408501602087016102f5565b601f01601f19169190910160400192915050565b61034d8061044d6000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102f1602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516101079190610283565b600060405180830381855af49150503d8060008114610142576040519150601f19603f3d011682016040523d82523d6000602084013e610147565b606091505b509150915061015886838387610162565b9695505050505050565b606083156101fd5782516000036101f65773ffffffffffffffffffffffffffffffffffffffff85163b6101f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610207565b610207838361020f565b949350505050565b81511561021f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ed919061029f565b60005b8381101561026e578181015183820152602001610256565b8381111561027d576000848401525b50505050565b60008251610295818460208701610253565b9190910192915050565b60208152600082518060208401526102be816040850160208701610253565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201cd78ab6a31213989661cff2d7d05fc9b9c38b1a848e8249e2e398659a9eb7e364736f6c634300080f0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122070aa03035a81441673770173c347020a4af1bf8f651ceebc066752c059bdbac764736f6c634300080f0033",
+ "devdoc": {
+ "kind": "dev",
+ "methods": {},
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {
+ "createAccount(address,uint256)": {
+ "notice": "create an account, and return its address. returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation"
+ },
+ "getAddress(address,uint256)": {
+ "notice": "calculate the counterfactual address of this account as it would be returned by createAccount()"
+ }
+ },
+ "notice": "A sample factory contract for SimpleAccount A UserOperations \"initCode\" holds the address of the factory, and a method call (to createAccount, in this sample factory). The factory's createAccount returns the target account address even if it is already installed. This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.",
+ "version": 1
+ },
+ "storageLayout": {
+ "storage": [],
+ "types": null
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/02113a2ed1850c3774563305ee607f11.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/02113a2ed1850c3774563305ee607f11.json
new file mode 100644
index 000000000..0df6e9575
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/02113a2ed1850c3774563305ee607f11.json
@@ -0,0 +1,329 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@gnosis.pm/safe-contracts/contracts/base/Executor.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\nimport \"../common/Enum.sol\";\n\n/// @title Executor - A contract that can execute transactions\n/// @author Richard Meissner - \ncontract Executor {\n function execute(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation,\n uint256 txGas\n ) internal returns (bool success) {\n if (operation == Enum.Operation.DelegateCall) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n } else {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/base/FallbackManager.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"../common/SelfAuthorized.sol\";\n\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\n/// @author Richard Meissner - \ncontract FallbackManager is SelfAuthorized {\n event ChangedFallbackHandler(address handler);\n\n // keccak256(\"fallback_manager.handler.address\")\n bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT = 0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d5;\n\n function internalSetFallbackHandler(address handler) internal {\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, handler)\n }\n }\n\n /// @dev Allows to add a contract to handle fallback calls.\n /// Only fallback calls without value and with data will be forwarded.\n /// This can only be done via a Safe transaction.\n /// @param handler contract to handle fallbacks calls.\n function setFallbackHandler(address handler) public authorized {\n internalSetFallbackHandler(handler);\n emit ChangedFallbackHandler(handler);\n }\n\n // solhint-disable-next-line payable-fallback,no-complex-fallback\n fallback() external {\n bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let handler := sload(slot)\n if iszero(handler) {\n return(0, 0)\n }\n calldatacopy(0, 0, calldatasize())\n // The msg.sender address is shifted to the left by 12 bytes to remove the padding\n // Then the address without padding is stored right after the calldata\n mstore(calldatasize(), shl(96, caller()))\n // Add 20 bytes for the address appended add the end\n let success := call(gas(), handler, 0, 0, add(calldatasize(), 20), 0, 0)\n returndatacopy(0, 0, returndatasize())\n if iszero(success) {\n revert(0, returndatasize())\n }\n return(0, returndatasize())\n }\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/base/GuardManager.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"../common/Enum.sol\";\nimport \"../common/SelfAuthorized.sol\";\n\ninterface Guard {\n function checkTransaction(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation,\n uint256 safeTxGas,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address payable refundReceiver,\n bytes memory signatures,\n address msgSender\n ) external;\n\n function checkAfterExecution(bytes32 txHash, bool success) external;\n}\n\n/// @title Fallback Manager - A contract that manages fallback calls made to this contract\n/// @author Richard Meissner - \ncontract GuardManager is SelfAuthorized {\n event ChangedGuard(address guard);\n // keccak256(\"guard_manager.guard.address\")\n bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;\n\n /// @dev Set a guard that checks transactions before execution\n /// @param guard The address of the guard to be used or the 0 address to disable the guard\n function setGuard(address guard) external authorized {\n bytes32 slot = GUARD_STORAGE_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, guard)\n }\n emit ChangedGuard(guard);\n }\n\n function getGuard() internal view returns (address guard) {\n bytes32 slot = GUARD_STORAGE_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n guard := sload(slot)\n }\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/base/ModuleManager.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\nimport \"../common/Enum.sol\";\nimport \"../common/SelfAuthorized.sol\";\nimport \"./Executor.sol\";\n\n/// @title Module Manager - A contract that manages modules that can execute transactions via this contract\n/// @author Stefan George - \n/// @author Richard Meissner - \ncontract ModuleManager is SelfAuthorized, Executor {\n event EnabledModule(address module);\n event DisabledModule(address module);\n event ExecutionFromModuleSuccess(address indexed module);\n event ExecutionFromModuleFailure(address indexed module);\n\n address internal constant SENTINEL_MODULES = address(0x1);\n\n mapping(address => address) internal modules;\n\n function setupModules(address to, bytes memory data) internal {\n require(modules[SENTINEL_MODULES] == address(0), \"GS100\");\n modules[SENTINEL_MODULES] = SENTINEL_MODULES;\n if (to != address(0))\n // Setup has to complete successfully or transaction fails.\n require(execute(to, 0, data, Enum.Operation.DelegateCall, gasleft()), \"GS000\");\n }\n\n /// @dev Allows to add a module to the whitelist.\n /// This can only be done via a Safe transaction.\n /// @notice Enables the module `module` for the Safe.\n /// @param module Module to be whitelisted.\n function enableModule(address module) public authorized {\n // Module address cannot be null or sentinel.\n require(module != address(0) && module != SENTINEL_MODULES, \"GS101\");\n // Module cannot be added twice.\n require(modules[module] == address(0), \"GS102\");\n modules[module] = modules[SENTINEL_MODULES];\n modules[SENTINEL_MODULES] = module;\n emit EnabledModule(module);\n }\n\n /// @dev Allows to remove a module from the whitelist.\n /// This can only be done via a Safe transaction.\n /// @notice Disables the module `module` for the Safe.\n /// @param prevModule Module that pointed to the module to be removed in the linked list\n /// @param module Module to be removed.\n function disableModule(address prevModule, address module) public authorized {\n // Validate module address and check that it corresponds to module index.\n require(module != address(0) && module != SENTINEL_MODULES, \"GS101\");\n require(modules[prevModule] == module, \"GS103\");\n modules[prevModule] = modules[module];\n modules[module] = address(0);\n emit DisabledModule(module);\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation\n ) public virtual returns (bool success) {\n // Only whitelisted modules are allowed.\n require(msg.sender != SENTINEL_MODULES && modules[msg.sender] != address(0), \"GS104\");\n // Execute transaction without further confirmations.\n success = execute(to, value, data, operation, gasleft());\n if (success) emit ExecutionFromModuleSuccess(msg.sender);\n else emit ExecutionFromModuleFailure(msg.sender);\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations and return data\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModuleReturnData(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation\n ) public returns (bool success, bytes memory returnData) {\n success = execTransactionFromModule(to, value, data, operation);\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // Load free memory location\n let ptr := mload(0x40)\n // We allocate memory for the return data by setting the free memory location to\n // current free memory location + data size + 32 bytes for data size value\n mstore(0x40, add(ptr, add(returndatasize(), 0x20)))\n // Store the size\n mstore(ptr, returndatasize())\n // Store the data\n returndatacopy(add(ptr, 0x20), 0, returndatasize())\n // Point the return data to the correct memory location\n returnData := ptr\n }\n }\n\n /// @dev Returns if an module is enabled\n /// @return True if the module is enabled\n function isModuleEnabled(address module) public view returns (bool) {\n return SENTINEL_MODULES != module && modules[module] != address(0);\n }\n\n /// @dev Returns array of modules.\n /// @param start Start of the page.\n /// @param pageSize Maximum number of modules that should be returned.\n /// @return array Array of modules.\n /// @return next Start of the next page.\n function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next) {\n // Init array with max page size\n array = new address[](pageSize);\n\n // Populate return array\n uint256 moduleCount = 0;\n address currentModule = modules[start];\n while (currentModule != address(0x0) && currentModule != SENTINEL_MODULES && moduleCount < pageSize) {\n array[moduleCount] = currentModule;\n currentModule = modules[currentModule];\n moduleCount++;\n }\n next = currentModule;\n // Set correct size of returned array\n // solhint-disable-next-line no-inline-assembly\n assembly {\n mstore(array, moduleCount)\n }\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/base/OwnerManager.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\nimport \"../common/SelfAuthorized.sol\";\n\n/// @title OwnerManager - Manages a set of owners and a threshold to perform actions.\n/// @author Stefan George - \n/// @author Richard Meissner - \ncontract OwnerManager is SelfAuthorized {\n event AddedOwner(address owner);\n event RemovedOwner(address owner);\n event ChangedThreshold(uint256 threshold);\n\n address internal constant SENTINEL_OWNERS = address(0x1);\n\n mapping(address => address) internal owners;\n uint256 internal ownerCount;\n uint256 internal threshold;\n\n /// @dev Setup function sets initial storage of contract.\n /// @param _owners List of Safe owners.\n /// @param _threshold Number of required confirmations for a Safe transaction.\n function setupOwners(address[] memory _owners, uint256 _threshold) internal {\n // Threshold can only be 0 at initialization.\n // Check ensures that setup function can only be called once.\n require(threshold == 0, \"GS200\");\n // Validate that threshold is smaller than number of added owners.\n require(_threshold <= _owners.length, \"GS201\");\n // There has to be at least one Safe owner.\n require(_threshold >= 1, \"GS202\");\n // Initializing Safe owners.\n address currentOwner = SENTINEL_OWNERS;\n for (uint256 i = 0; i < _owners.length; i++) {\n // Owner address cannot be null.\n address owner = _owners[i];\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this) && currentOwner != owner, \"GS203\");\n // No duplicate owners allowed.\n require(owners[owner] == address(0), \"GS204\");\n owners[currentOwner] = owner;\n currentOwner = owner;\n }\n owners[currentOwner] = SENTINEL_OWNERS;\n ownerCount = _owners.length;\n threshold = _threshold;\n }\n\n /// @dev Allows to add a new owner to the Safe and update the threshold at the same time.\n /// This can only be done via a Safe transaction.\n /// @notice Adds the owner `owner` to the Safe and updates the threshold to `_threshold`.\n /// @param owner New owner address.\n /// @param _threshold New threshold.\n function addOwnerWithThreshold(address owner, uint256 _threshold) public authorized {\n // Owner address cannot be null, the sentinel or the Safe itself.\n require(owner != address(0) && owner != SENTINEL_OWNERS && owner != address(this), \"GS203\");\n // No duplicate owners allowed.\n require(owners[owner] == address(0), \"GS204\");\n owners[owner] = owners[SENTINEL_OWNERS];\n owners[SENTINEL_OWNERS] = owner;\n ownerCount++;\n emit AddedOwner(owner);\n // Change threshold if threshold was changed.\n if (threshold != _threshold) changeThreshold(_threshold);\n }\n\n /// @dev Allows to remove an owner from the Safe and update the threshold at the same time.\n /// This can only be done via a Safe transaction.\n /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.\n /// @param prevOwner Owner that pointed to the owner to be removed in the linked list\n /// @param owner Owner address to be removed.\n /// @param _threshold New threshold.\n function removeOwner(\n address prevOwner,\n address owner,\n uint256 _threshold\n ) public authorized {\n // Only allow to remove an owner, if threshold can still be reached.\n require(ownerCount - 1 >= _threshold, \"GS201\");\n // Validate owner address and check that it corresponds to owner index.\n require(owner != address(0) && owner != SENTINEL_OWNERS, \"GS203\");\n require(owners[prevOwner] == owner, \"GS205\");\n owners[prevOwner] = owners[owner];\n owners[owner] = address(0);\n ownerCount--;\n emit RemovedOwner(owner);\n // Change threshold if threshold was changed.\n if (threshold != _threshold) changeThreshold(_threshold);\n }\n\n /// @dev Allows to swap/replace an owner from the Safe with another address.\n /// This can only be done via a Safe transaction.\n /// @notice Replaces the owner `oldOwner` in the Safe with `newOwner`.\n /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list\n /// @param oldOwner Owner address to be replaced.\n /// @param newOwner New owner address.\n function swapOwner(\n address prevOwner,\n address oldOwner,\n address newOwner\n ) public authorized {\n // Owner address cannot be null, the sentinel or the Safe itself.\n require(newOwner != address(0) && newOwner != SENTINEL_OWNERS && newOwner != address(this), \"GS203\");\n // No duplicate owners allowed.\n require(owners[newOwner] == address(0), \"GS204\");\n // Validate oldOwner address and check that it corresponds to owner index.\n require(oldOwner != address(0) && oldOwner != SENTINEL_OWNERS, \"GS203\");\n require(owners[prevOwner] == oldOwner, \"GS205\");\n owners[newOwner] = owners[oldOwner];\n owners[prevOwner] = newOwner;\n owners[oldOwner] = address(0);\n emit RemovedOwner(oldOwner);\n emit AddedOwner(newOwner);\n }\n\n /// @dev Allows to update the number of required confirmations by Safe owners.\n /// This can only be done via a Safe transaction.\n /// @notice Changes the threshold of the Safe to `_threshold`.\n /// @param _threshold New threshold.\n function changeThreshold(uint256 _threshold) public authorized {\n // Validate that threshold is smaller than number of owners.\n require(_threshold <= ownerCount, \"GS201\");\n // There has to be at least one Safe owner.\n require(_threshold >= 1, \"GS202\");\n threshold = _threshold;\n emit ChangedThreshold(threshold);\n }\n\n function getThreshold() public view returns (uint256) {\n return threshold;\n }\n\n function isOwner(address owner) public view returns (bool) {\n return owner != SENTINEL_OWNERS && owners[owner] != address(0);\n }\n\n /// @dev Returns array of owners.\n /// @return Array of Safe owners.\n function getOwners() public view returns (address[] memory) {\n address[] memory array = new address[](ownerCount);\n\n // populate return array\n uint256 index = 0;\n address currentOwner = owners[SENTINEL_OWNERS];\n while (currentOwner != SENTINEL_OWNERS) {\n array[index] = currentOwner;\n currentOwner = owners[currentOwner];\n index++;\n }\n return array;\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/common/Enum.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title Enum - Collection of enums\n/// @author Richard Meissner - \ncontract Enum {\n enum Operation {Call, DelegateCall}\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/common/EtherPaymentFallback.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title EtherPaymentFallback - A contract that has a fallback to accept ether payments\n/// @author Richard Meissner - \ncontract EtherPaymentFallback {\n event SafeReceived(address indexed sender, uint256 value);\n\n /// @dev Fallback function accepts Ether transactions.\n receive() external payable {\n emit SafeReceived(msg.sender, msg.value);\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/common/SecuredTokenTransfer.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title SecuredTokenTransfer - Secure token transfer\n/// @author Richard Meissner - \ncontract SecuredTokenTransfer {\n /// @dev Transfers a token and returns if it was a success\n /// @param token Token that should be transferred\n /// @param receiver Receiver to whom the token should be transferred\n /// @param amount The amount of tokens that should be transferred\n function transferToken(\n address token,\n address receiver,\n uint256 amount\n ) internal returns (bool transferred) {\n // 0xa9059cbb - keccack(\"transfer(address,uint256)\")\n bytes memory data = abi.encodeWithSelector(0xa9059cbb, receiver, amount);\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // We write the return value to scratch space.\n // See https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory\n let success := call(sub(gas(), 10000), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n switch returndatasize()\n case 0 {\n transferred := success\n }\n case 0x20 {\n transferred := iszero(or(iszero(success), iszero(mload(0))))\n }\n default {\n transferred := 0\n }\n }\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/common/SelfAuthorized.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title SelfAuthorized - authorizes current contract to perform actions\n/// @author Richard Meissner - \ncontract SelfAuthorized {\n function requireSelfCall() private view {\n require(msg.sender == address(this), \"GS031\");\n }\n\n modifier authorized() {\n // This is a function call as it minimized the bytecode size\n requireSelfCall();\n _;\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/common/SignatureDecoder.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title SignatureDecoder - Decodes signatures that a encoded as bytes\n/// @author Richard Meissner - \ncontract SignatureDecoder {\n /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.\n /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures\n /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access\n /// @param signatures concatenated rsv signatures\n function signatureSplit(bytes memory signatures, uint256 pos)\n internal\n pure\n returns (\n uint8 v,\n bytes32 r,\n bytes32 s\n )\n {\n // The signature format is a compact form of:\n // {bytes32 r}{bytes32 s}{uint8 v}\n // Compact means, uint8 is not padded to 32 bytes.\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let signaturePos := mul(0x41, pos)\n r := mload(add(signatures, add(signaturePos, 0x20)))\n s := mload(add(signatures, add(signaturePos, 0x40)))\n // Here we are loading the last 32 bytes, including 31 bytes\n // of 's'. There is no 'mload8' to do this.\n //\n // 'byte' is not working due to the Solidity parser, so lets\n // use the second best option, 'and'\n v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)\n }\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/common/Singleton.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title Singleton - Base for singleton contracts (should always be first super contract)\n/// This contract is tightly coupled to our proxy contract (see `proxies/GnosisSafeProxy.sol`)\n/// @author Richard Meissner - \ncontract Singleton {\n // singleton always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.\n // It should also always be ensured that the address is stored alone (uses a full word)\n address private singleton;\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/common/StorageAccessible.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title StorageAccessible - generic base contract that allows callers to access all internal storage.\n/// @notice See https://github.com/gnosis/util-contracts/blob/bb5fe5fb5df6d8400998094fb1b32a178a47c3a1/contracts/StorageAccessible.sol\ncontract StorageAccessible {\n /**\n * @dev Reads `length` bytes of storage in the currents contract\n * @param offset - the offset in the current contract's storage in words to start reading from\n * @param length - the number of words (32 bytes) of data to read\n * @return the bytes that were read.\n */\n function getStorageAt(uint256 offset, uint256 length) public view returns (bytes memory) {\n bytes memory result = new bytes(length * 32);\n for (uint256 index = 0; index < length; index++) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let word := sload(add(offset, index))\n mstore(add(add(result, 0x20), mul(index, 0x20)), word)\n }\n }\n return result;\n }\n\n /**\n * @dev Performs a delegetecall on a targetContract in the context of self.\n * Internally reverts execution to avoid side effects (making it static).\n *\n * This method reverts with data equal to `abi.encode(bool(success), bytes(response))`.\n * Specifically, the `returndata` after a call to this method will be:\n * `success:bool || response.length:uint256 || response:bytes`.\n *\n * @param targetContract Address of the contract containing the code to execute.\n * @param calldataPayload Calldata that should be sent to the target contract (encoded method name and arguments).\n */\n function simulateAndRevert(address targetContract, bytes memory calldataPayload) external {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let success := delegatecall(gas(), targetContract, add(calldataPayload, 0x20), mload(calldataPayload), 0, 0)\n\n mstore(0x00, success)\n mstore(0x20, returndatasize())\n returndatacopy(0x40, 0, returndatasize())\n revert(0, add(returndatasize(), 0x40))\n }\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title GnosisSafeStorage - Storage layout of the Safe contracts to be used in libraries\n/// @author Richard Meissner - \ncontract GnosisSafeStorage {\n // From /common/Singleton.sol\n address internal singleton;\n // From /common/ModuleManager.sol\n mapping(address => address) internal modules;\n // From /common/OwnerManager.sol\n mapping(address => address) internal owners;\n uint256 internal ownerCount;\n uint256 internal threshold;\n\n // From /GnosisSafe.sol\n bytes32 internal nonce;\n bytes32 internal domainSeparator;\n mapping(bytes32 => uint256) internal signedMessages;\n mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/external/GnosisSafeMath.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/**\n * @title GnosisSafeMath\n * @dev Math operations with safety checks that revert on error\n * Renamed from SafeMath to GnosisSafeMath to avoid conflicts\n * TODO: remove once open zeppelin update to solc 0.5.0\n */\nlibrary GnosisSafeMath {\n /**\n * @dev Multiplies two numbers, reverts on overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b);\n\n return c;\n }\n\n /**\n * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a);\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Adds two numbers, reverts on overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a);\n\n return c;\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"
+ },
+ "@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"./base/ModuleManager.sol\";\nimport \"./base/OwnerManager.sol\";\nimport \"./base/FallbackManager.sol\";\nimport \"./base/GuardManager.sol\";\nimport \"./common/EtherPaymentFallback.sol\";\nimport \"./common/Singleton.sol\";\nimport \"./common/SignatureDecoder.sol\";\nimport \"./common/SecuredTokenTransfer.sol\";\nimport \"./common/StorageAccessible.sol\";\nimport \"./interfaces/ISignatureValidator.sol\";\nimport \"./external/GnosisSafeMath.sol\";\n\n/// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\n/// @author Stefan George - \n/// @author Richard Meissner - \ncontract GnosisSafe is\n EtherPaymentFallback,\n Singleton,\n ModuleManager,\n OwnerManager,\n SignatureDecoder,\n SecuredTokenTransfer,\n ISignatureValidatorConstants,\n FallbackManager,\n StorageAccessible,\n GuardManager\n{\n using GnosisSafeMath for uint256;\n\n string public constant VERSION = \"1.3.0\";\n\n // keccak256(\n // \"EIP712Domain(uint256 chainId,address verifyingContract)\"\n // );\n bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\n\n // keccak256(\n // \"SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)\"\n // );\n bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;\n\n event SafeSetup(address indexed initiator, address[] owners, uint256 threshold, address initializer, address fallbackHandler);\n event ApproveHash(bytes32 indexed approvedHash, address indexed owner);\n event SignMsg(bytes32 indexed msgHash);\n event ExecutionFailure(bytes32 txHash, uint256 payment);\n event ExecutionSuccess(bytes32 txHash, uint256 payment);\n\n uint256 public nonce;\n bytes32 private _deprecatedDomainSeparator;\n // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners\n mapping(bytes32 => uint256) public signedMessages;\n // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners\n mapping(address => mapping(bytes32 => uint256)) public approvedHashes;\n\n // This constructor ensures that this contract can only be used as a master copy for Proxy contracts\n constructor() {\n // By setting the threshold it is not possible to call setup anymore,\n // so we create a Safe with 0 owners and threshold 1.\n // This is an unusable Safe, perfect for the singleton\n threshold = 1;\n }\n\n /// @dev Setup function sets initial storage of contract.\n /// @param _owners List of Safe owners.\n /// @param _threshold Number of required confirmations for a Safe transaction.\n /// @param to Contract address for optional delegate call.\n /// @param data Data payload for optional delegate call.\n /// @param fallbackHandler Handler for fallback calls to this contract\n /// @param paymentToken Token that should be used for the payment (0 is ETH)\n /// @param payment Value that should be paid\n /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)\n function setup(\n address[] calldata _owners,\n uint256 _threshold,\n address to,\n bytes calldata data,\n address fallbackHandler,\n address paymentToken,\n uint256 payment,\n address payable paymentReceiver\n ) external {\n // setupOwners checks if the Threshold is already set, therefore preventing that this method is called twice\n setupOwners(_owners, _threshold);\n if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler);\n // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules\n setupModules(to, data);\n\n if (payment > 0) {\n // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself)\n // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment\n handlePayment(payment, 0, 1, paymentToken, paymentReceiver);\n }\n emit SafeSetup(msg.sender, _owners, _threshold, to, fallbackHandler);\n }\n\n /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\n /// Note: The fees are always transferred, even if the user transaction fails.\n /// @param to Destination address of Safe transaction.\n /// @param value Ether value of Safe transaction.\n /// @param data Data payload of Safe transaction.\n /// @param operation Operation type of Safe transaction.\n /// @param safeTxGas Gas that should be used for the Safe transaction.\n /// @param baseGas Gas costs that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\n /// @param gasPrice Gas price that should be used for the payment calculation.\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\n function execTransaction(\n address to,\n uint256 value,\n bytes calldata data,\n Enum.Operation operation,\n uint256 safeTxGas,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address payable refundReceiver,\n bytes memory signatures\n ) public payable virtual returns (bool success) {\n bytes32 txHash;\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\n {\n bytes memory txHashData =\n encodeTransactionData(\n // Transaction info\n to,\n value,\n data,\n operation,\n safeTxGas,\n // Payment info\n baseGas,\n gasPrice,\n gasToken,\n refundReceiver,\n // Signature info\n nonce\n );\n // Increase nonce and execute transaction.\n nonce++;\n txHash = keccak256(txHashData);\n checkSignatures(txHash, txHashData, signatures);\n }\n address guard = getGuard();\n {\n if (guard != address(0)) {\n Guard(guard).checkTransaction(\n // Transaction info\n to,\n value,\n data,\n operation,\n safeTxGas,\n // Payment info\n baseGas,\n gasPrice,\n gasToken,\n refundReceiver,\n // Signature info\n signatures,\n msg.sender\n );\n }\n }\n // We require some gas to emit the events (at least 2500) after the execution and some to perform code until the execution (500)\n // We also include the 1/64 in the check that is not send along with a call to counteract potential shortings because of EIP-150\n require(gasleft() >= ((safeTxGas * 64) / 63).max(safeTxGas + 2500) + 500, \"GS010\");\n // Use scope here to limit variable lifetime and prevent `stack too deep` errors\n {\n uint256 gasUsed = gasleft();\n // If the gasPrice is 0 we assume that nearly all available gas can be used (it is always more than safeTxGas)\n // We only substract 2500 (compared to the 3000 before) to ensure that the amount passed is still higher than safeTxGas\n success = execute(to, value, data, operation, gasPrice == 0 ? (gasleft() - 2500) : safeTxGas);\n gasUsed = gasUsed.sub(gasleft());\n // If no safeTxGas and no gasPrice was set (e.g. both are 0), then the internal tx is required to be successful\n // This makes it possible to use `estimateGas` without issues, as it searches for the minimum gas where the tx doesn't revert\n require(success || safeTxGas != 0 || gasPrice != 0, \"GS013\");\n // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls\n uint256 payment = 0;\n if (gasPrice > 0) {\n payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver);\n }\n if (success) emit ExecutionSuccess(txHash, payment);\n else emit ExecutionFailure(txHash, payment);\n }\n {\n if (guard != address(0)) {\n Guard(guard).checkAfterExecution(txHash, success);\n }\n }\n }\n\n function handlePayment(\n uint256 gasUsed,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address payable refundReceiver\n ) private returns (uint256 payment) {\n // solhint-disable-next-line avoid-tx-origin\n address payable receiver = refundReceiver == address(0) ? payable(tx.origin) : refundReceiver;\n if (gasToken == address(0)) {\n // For ETH we will only adjust the gas price to not be higher than the actual used gas price\n payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice);\n require(receiver.send(payment), \"GS011\");\n } else {\n payment = gasUsed.add(baseGas).mul(gasPrice);\n require(transferToken(gasToken, receiver, payment), \"GS012\");\n }\n }\n\n /**\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\n * @param data That should be signed (this is passed to an external validator contract)\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\n */\n function checkSignatures(\n bytes32 dataHash,\n bytes memory data,\n bytes memory signatures\n ) public view {\n // Load threshold to avoid multiple storage loads\n uint256 _threshold = threshold;\n // Check that a threshold is set\n require(_threshold > 0, \"GS001\");\n checkNSignatures(dataHash, data, signatures, _threshold);\n }\n\n /**\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\n * @param data That should be signed (this is passed to an external validator contract)\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\n * @param requiredSignatures Amount of required valid signatures.\n */\n function checkNSignatures(\n bytes32 dataHash,\n bytes memory data,\n bytes memory signatures,\n uint256 requiredSignatures\n ) public view {\n // Check that the provided signature data is not too short\n require(signatures.length >= requiredSignatures.mul(65), \"GS020\");\n // There cannot be an owner with address 0.\n address lastOwner = address(0);\n address currentOwner;\n uint8 v;\n bytes32 r;\n bytes32 s;\n uint256 i;\n for (i = 0; i < requiredSignatures; i++) {\n (v, r, s) = signatureSplit(signatures, i);\n if (v == 0) {\n // If v is 0 then it is a contract signature\n // When handling contract signatures the address of the contract is encoded into r\n currentOwner = address(uint160(uint256(r)));\n\n // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes\n // This check is not completely accurate, since it is possible that more signatures than the threshold are send.\n // Here we only check that the pointer is not pointing inside the part that is being processed\n require(uint256(s) >= requiredSignatures.mul(65), \"GS021\");\n\n // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes)\n require(uint256(s).add(32) <= signatures.length, \"GS022\");\n\n // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length\n uint256 contractSignatureLen;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n contractSignatureLen := mload(add(add(signatures, s), 0x20))\n }\n require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, \"GS023\");\n\n // Check signature\n bytes memory contractSignature;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s\n contractSignature := add(add(signatures, s), 0x20)\n }\n require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, \"GS024\");\n } else if (v == 1) {\n // If v is 1 then it is an approved hash\n // When handling approved hashes the address of the approver is encoded into r\n currentOwner = address(uint160(uint256(r)));\n // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction\n require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, \"GS025\");\n } else if (v > 30) {\n // If v > 30 then default va (27,28) has been adjusted for eth_sign flow\n // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover\n currentOwner = ecrecover(keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", dataHash)), v - 4, r, s);\n } else {\n // Default is the ecrecover flow with the provided data hash\n // Use ecrecover with the messageHash for EOA signatures\n currentOwner = ecrecover(dataHash, v, r, s);\n }\n require(currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS, \"GS026\");\n lastOwner = currentOwner;\n }\n }\n\n /// @dev Allows to estimate a Safe transaction.\n /// This method is only meant for estimation purpose, therefore the call will always revert and encode the result in the revert data.\n /// Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\n /// @param to Destination address of Safe transaction.\n /// @param value Ether value of Safe transaction.\n /// @param data Data payload of Safe transaction.\n /// @param operation Operation type of Safe transaction.\n /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\n /// @notice Deprecated in favor of common/StorageAccessible.sol and will be removed in next version.\n function requiredTxGas(\n address to,\n uint256 value,\n bytes calldata data,\n Enum.Operation operation\n ) external returns (uint256) {\n uint256 startGas = gasleft();\n // We don't provide an error message here, as we use it to return the estimate\n require(execute(to, value, data, operation, gasleft()));\n uint256 requiredGas = startGas - gasleft();\n // Convert response to string and return via error message\n revert(string(abi.encodePacked(requiredGas)));\n }\n\n /**\n * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\n * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract.\n */\n function approveHash(bytes32 hashToApprove) external {\n require(owners[msg.sender] != address(0), \"GS030\");\n approvedHashes[msg.sender][hashToApprove] = 1;\n emit ApproveHash(hashToApprove, msg.sender);\n }\n\n /// @dev Returns the chain id used by this contract.\n function getChainId() public view returns (uint256) {\n uint256 id;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n id := chainid()\n }\n return id;\n }\n\n function domainSeparator() public view returns (bytes32) {\n return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, getChainId(), this));\n }\n\n /// @dev Returns the bytes that are hashed to be signed by owners.\n /// @param to Destination address.\n /// @param value Ether value.\n /// @param data Data payload.\n /// @param operation Operation type.\n /// @param safeTxGas Gas that should be used for the safe transaction.\n /// @param baseGas Gas costs for that are independent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\n /// @param gasPrice Maximum gas price that should be used for this transaction.\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n /// @param _nonce Transaction nonce.\n /// @return Transaction hash bytes.\n function encodeTransactionData(\n address to,\n uint256 value,\n bytes calldata data,\n Enum.Operation operation,\n uint256 safeTxGas,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address refundReceiver,\n uint256 _nonce\n ) public view returns (bytes memory) {\n bytes32 safeTxHash =\n keccak256(\n abi.encode(\n SAFE_TX_TYPEHASH,\n to,\n value,\n keccak256(data),\n operation,\n safeTxGas,\n baseGas,\n gasPrice,\n gasToken,\n refundReceiver,\n _nonce\n )\n );\n return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeTxHash);\n }\n\n /// @dev Returns hash to be signed by owners.\n /// @param to Destination address.\n /// @param value Ether value.\n /// @param data Data payload.\n /// @param operation Operation type.\n /// @param safeTxGas Fas that should be used for the safe transaction.\n /// @param baseGas Gas costs for data used to trigger the safe transaction.\n /// @param gasPrice Maximum gas price that should be used for this transaction.\n /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n /// @param _nonce Transaction nonce.\n /// @return Transaction hash.\n function getTransactionHash(\n address to,\n uint256 value,\n bytes calldata data,\n Enum.Operation operation,\n uint256 safeTxGas,\n uint256 baseGas,\n uint256 gasPrice,\n address gasToken,\n address refundReceiver,\n uint256 _nonce\n ) public view returns (bytes32) {\n return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce));\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"../interfaces/ERC1155TokenReceiver.sol\";\nimport \"../interfaces/ERC721TokenReceiver.sol\";\nimport \"../interfaces/ERC777TokensRecipient.sol\";\nimport \"../interfaces/IERC165.sol\";\n\n/// @title Default Callback Handler - returns true for known token callbacks\n/// @author Richard Meissner - \ncontract DefaultCallbackHandler is ERC1155TokenReceiver, ERC777TokensRecipient, ERC721TokenReceiver, IERC165 {\n string public constant NAME = \"Default Callback Handler\";\n string public constant VERSION = \"1.0.0\";\n\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return 0xf23a6e61;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] calldata,\n uint256[] calldata,\n bytes calldata\n ) external pure override returns (bytes4) {\n return 0xbc197c81;\n }\n\n function onERC721Received(\n address,\n address,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return 0x150b7a02;\n }\n\n function tokensReceived(\n address,\n address,\n address,\n uint256,\n bytes calldata,\n bytes calldata\n ) external pure override {\n // We implement this for completeness, doesn't really have any value\n }\n\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\n return\n interfaceId == type(ERC1155TokenReceiver).interfaceId ||\n interfaceId == type(ERC721TokenReceiver).interfaceId ||\n interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/interfaces/ERC1155TokenReceiver.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/**\n Note: The ERC-165 identifier for this interface is 0x4e2312e0.\n*/\ninterface ERC1155TokenReceiver {\n /**\n @notice Handle the receipt of a single ERC1155 token type.\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. \n This function MUST return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (i.e. 0xf23a6e61) if it accepts the transfer.\n This function MUST revert if it rejects the transfer.\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\n @param _operator The address which initiated the transfer (i.e. msg.sender)\n @param _from The address which previously owned the token\n @param _id The ID of the token being transferred\n @param _value The amount of tokens being transferred\n @param _data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n */\n function onERC1155Received(\n address _operator,\n address _from,\n uint256 _id,\n uint256 _value,\n bytes calldata _data\n ) external returns (bytes4);\n\n /**\n @notice Handle the receipt of multiple ERC1155 token types.\n @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. \n This function MUST return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (i.e. 0xbc197c81) if it accepts the transfer(s).\n This function MUST revert if it rejects the transfer(s).\n Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.\n @param _operator The address which initiated the batch transfer (i.e. msg.sender)\n @param _from The address which previously owned the token\n @param _ids An array containing ids of each token being transferred (order and length must match _values array)\n @param _values An array containing amounts of each token being transferred (order and length must match _ids array)\n @param _data Additional data with no specified format\n @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n */\n function onERC1155BatchReceived(\n address _operator,\n address _from,\n uint256[] calldata _ids,\n uint256[] calldata _values,\n bytes calldata _data\n ) external returns (bytes4);\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/interfaces/ERC721TokenReceiver.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.\ninterface ERC721TokenReceiver {\n /// @notice Handle the receipt of an NFT\n /// @dev The ERC721 smart contract calls this function on the recipient\n /// after a `transfer`. This function MAY throw to revert and reject the\n /// transfer. Return of other than the magic value MUST result in the\n /// transaction being reverted.\n /// Note: the contract address is always the message sender.\n /// @param _operator The address which called `safeTransferFrom` function\n /// @param _from The address which previously owned the token\n /// @param _tokenId The NFT identifier which is being transferred\n /// @param _data Additional data with no specified format\n /// @return `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n /// unless throwing\n function onERC721Received(\n address _operator,\n address _from,\n uint256 _tokenId,\n bytes calldata _data\n ) external returns (bytes4);\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/interfaces/ERC777TokensRecipient.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\ninterface ERC777TokensRecipient {\n function tokensReceived(\n address operator,\n address from,\n address to,\n uint256 amount,\n bytes calldata data,\n bytes calldata operatorData\n ) external;\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol\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"
+ },
+ "@gnosis.pm/safe-contracts/contracts/interfaces/ISignatureValidator.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\ncontract ISignatureValidatorConstants {\n // bytes4(keccak256(\"isValidSignature(bytes,bytes)\")\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;\n}\n\nabstract contract ISignatureValidator is ISignatureValidatorConstants {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param _data Arbitrary length data signed on the behalf of address(this)\n * @param _signature Signature byte array associated with _data\n *\n * MUST return the bytes4 magic value 0x20c13b0b when function passes.\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\n * MUST allow external calls\n */\n function isValidSignature(bytes memory _data, bytes memory _signature) public view virtual returns (bytes4);\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain\n/// @author Richard Meissner - \ninterface IProxy {\n function masterCopy() external view returns (address);\n}\n\n/// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.\n/// @author Stefan George - \n/// @author Richard Meissner - \ncontract GnosisSafeProxy {\n // singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.\n // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`\n address internal singleton;\n\n /// @dev Constructor function sets address of singleton contract.\n /// @param _singleton Singleton address.\n constructor(address _singleton) {\n require(_singleton != address(0), \"Invalid singleton address provided\");\n singleton = _singleton;\n }\n\n /// @dev Fallback function forwards all transactions and returns all received return data.\n fallback() external payable {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n let _singleton := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)\n // 0xa619486e == keccak(\"masterCopy()\"). The value is right padded to 32-bytes with 0s\n if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {\n mstore(0, _singleton)\n return(0, 0x20)\n }\n calldatacopy(0, 0, calldatasize())\n let success := delegatecall(gas(), _singleton, 0, calldatasize(), 0, 0)\n returndatacopy(0, 0, returndatasize())\n if eq(success, 0) {\n revert(0, returndatasize())\n }\n return(0, returndatasize())\n }\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport \"./GnosisSafeProxy.sol\";\nimport \"./IProxyCreationCallback.sol\";\n\n/// @title Proxy Factory - Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n/// @author Stefan George - \ncontract GnosisSafeProxyFactory {\n event ProxyCreation(GnosisSafeProxy proxy, address singleton);\n\n /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n /// @param singleton Address of singleton contract.\n /// @param data Payload for message call sent to new proxy contract.\n function createProxy(address singleton, bytes memory data) public returns (GnosisSafeProxy proxy) {\n proxy = new GnosisSafeProxy(singleton);\n if (data.length > 0)\n // solhint-disable-next-line no-inline-assembly\n assembly {\n if eq(call(gas(), proxy, 0, add(data, 0x20), mload(data), 0, 0), 0) {\n revert(0, 0)\n }\n }\n emit ProxyCreation(proxy, singleton);\n }\n\n /// @dev Allows to retrieve the runtime code of a deployed Proxy. This can be used to check that the expected Proxy was deployed.\n function proxyRuntimeCode() public pure returns (bytes memory) {\n return type(GnosisSafeProxy).runtimeCode;\n }\n\n /// @dev Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address.\n function proxyCreationCode() public pure returns (bytes memory) {\n return type(GnosisSafeProxy).creationCode;\n }\n\n /// @dev Allows to create new proxy contact using CREATE2 but it doesn't run the initializer.\n /// This method is only meant as an utility to be called from other methods\n /// @param _singleton Address of singleton contract.\n /// @param initializer Payload for message call sent to new proxy contract.\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n function deployProxyWithNonce(\n address _singleton,\n bytes memory initializer,\n uint256 saltNonce\n ) internal returns (GnosisSafeProxy proxy) {\n // If the initializer changes the proxy address should change too. Hashing the initializer data is cheaper than just concatinating it\n bytes32 salt = keccak256(abi.encodePacked(keccak256(initializer), saltNonce));\n bytes memory deploymentData = abi.encodePacked(type(GnosisSafeProxy).creationCode, uint256(uint160(_singleton)));\n // solhint-disable-next-line no-inline-assembly\n assembly {\n proxy := create2(0x0, add(0x20, deploymentData), mload(deploymentData), salt)\n }\n require(address(proxy) != address(0), \"Create2 call failed\");\n }\n\n /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\n /// @param _singleton Address of singleton contract.\n /// @param initializer Payload for message call sent to new proxy contract.\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n function createProxyWithNonce(\n address _singleton,\n bytes memory initializer,\n uint256 saltNonce\n ) public returns (GnosisSafeProxy proxy) {\n proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);\n if (initializer.length > 0)\n // solhint-disable-next-line no-inline-assembly\n assembly {\n if eq(call(gas(), proxy, 0, add(initializer, 0x20), mload(initializer), 0, 0), 0) {\n revert(0, 0)\n }\n }\n emit ProxyCreation(proxy, _singleton);\n }\n\n /// @dev Allows to create new proxy contact, execute a message call to the new proxy and call a specified callback within one transaction\n /// @param _singleton Address of singleton contract.\n /// @param initializer Payload for message call sent to new proxy contract.\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n /// @param callback Callback that will be invoced after the new proxy contract has been successfully deployed and initialized.\n function createProxyWithCallback(\n address _singleton,\n bytes memory initializer,\n uint256 saltNonce,\n IProxyCreationCallback callback\n ) public returns (GnosisSafeProxy proxy) {\n uint256 saltNonceWithCallback = uint256(keccak256(abi.encodePacked(saltNonce, callback)));\n proxy = createProxyWithNonce(_singleton, initializer, saltNonceWithCallback);\n if (address(callback) != address(0)) callback.proxyCreated(proxy, _singleton, initializer, saltNonce);\n }\n\n /// @dev Allows to get the address for a new proxy contact created via `createProxyWithNonce`\n /// This method is only meant for address calculation purpose when you use an initializer that would revert,\n /// therefore the response is returned with a revert. When calling this method set `from` to the address of the proxy factory.\n /// @param _singleton Address of singleton contract.\n /// @param initializer Payload for message call sent to new proxy contract.\n /// @param saltNonce Nonce that will be used to generate the salt to calculate the address of the new proxy contract.\n function calculateCreateProxyWithNonceAddress(\n address _singleton,\n bytes calldata initializer,\n uint256 saltNonce\n ) external returns (GnosisSafeProxy proxy) {\n proxy = deployProxyWithNonce(_singleton, initializer, saltNonce);\n revert(string(abi.encodePacked(proxy)));\n }\n}\n"
+ },
+ "@gnosis.pm/safe-contracts/contracts/proxies/IProxyCreationCallback.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\nimport \"./GnosisSafeProxy.sol\";\n\ninterface IProxyCreationCallback {\n function proxyCreated(\n GnosisSafeProxy proxy,\n address _singleton,\n bytes calldata initializer,\n uint256 saltNonce\n ) external;\n}\n"
+ },
+ "@openzeppelin/contracts/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"
+ },
+ "@openzeppelin/contracts/interfaces/draft-IERC1822.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n"
+ },
+ "@openzeppelin/contracts/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n *\n * _Available since v4.1._\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with _data\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "@openzeppelin/contracts/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n"
+ },
+ "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n"
+ },
+ "@openzeppelin/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n"
+ },
+ "@openzeppelin/contracts/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/Address.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized < type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Internal function that returns the initialized version. Returns `_initialized`\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Internal function that returns the initialized version. Returns `_initializing`\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n"
+ },
+ "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../ERC1967/ERC1967Upgrade.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n address private immutable __self = address(this);\n\n /**\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n * fail.\n */\n modifier onlyProxy() {\n require(address(this) != __self, \"Function must be called through delegatecall\");\n require(_getImplementation() == __self, \"Function must be called through active proxy\");\n _;\n }\n\n /**\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n * callable on the implementing contract but not through proxies.\n */\n modifier notDelegated() {\n require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n _;\n }\n\n /**\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n */\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n return _IMPLEMENTATION_SLOT;\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n */\n function upgradeTo(address newImplementation) external virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n * encoded in `data`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, data, true);\n }\n\n /**\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n * {upgradeTo} and {upgradeToAndCall}.\n *\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n *\n * ```solidity\n * function _authorizeUpgrade(address) internal override onlyOwner {}\n * ```\n */\n function _authorizeUpgrade(address newImplementation) internal virtual;\n}\n"
+ },
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n"
+ },
+ "@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.\n *\n * Accounts can be notified of {IERC777} tokens being sent to them by having a\n * contract implement this interface (contract holders can be their own\n * implementer) and registering it on the\n * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].\n *\n * See {IERC1820Registry} and {ERC1820Implementer}.\n */\ninterface IERC777Recipient {\n /**\n * @dev Called by an {IERC777} token contract whenever tokens are being\n * moved or created into a registered account (`to`). The type of operation\n * is conveyed by `from` being the zero address or not.\n *\n * This call occurs _after_ the token contract's state is updated, so\n * {IERC777-balanceOf}, etc., can be used to query the post-operation state.\n *\n * This function may revert to prevent the operation from being executed.\n */\n function tokensReceived(\n address operator,\n address from,\n address to,\n uint256 amount,\n bytes calldata userData,\n bytes calldata operatorData\n ) external;\n}\n"
+ },
+ "@openzeppelin/contracts/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"
+ },
+ "@openzeppelin/contracts/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"
+ },
+ "@openzeppelin/contracts/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 // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ 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) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\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"
+ },
+ "@openzeppelin/contracts/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 ÷ 2 + 1, and for v in (302): v ∈ {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"
+ },
+ "@openzeppelin/contracts/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"
+ },
+ "@openzeppelin/contracts/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 // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `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"
+ },
+ "@openzeppelin/contracts/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n}\n"
+ },
+ "@openzeppelin/contracts/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"
+ },
+ "contracts/core/BaseAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-empty-blocks */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"./Helpers.sol\";\n\n/**\n * Basic account implementation.\n * this contract provides the basic logic for implementing the IAccount interface - validateUserOp\n * specific account implementation should inherit it and provide the account-specific logic\n */\nabstract contract BaseAccount is IAccount {\n using UserOperationLib for UserOperation;\n\n //return value in case of signature failure, with no time-range.\n // equivalent to _packValidationData(true,0,0);\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\n\n /**\n * Return the account nonce.\n * This method returns the next sequential nonce.\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\n */\n function getNonce() public view virtual returns (uint256) {\n return entryPoint().getNonce(address(this), 0);\n }\n\n /**\n * return the entryPoint used by this account.\n * subclass should return the current entryPoint used by this account.\n */\n function entryPoint() public view virtual returns (IEntryPoint);\n\n /**\n * Validate user's signature and nonce.\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation methods.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external override virtual returns (uint256 validationData) {\n _requireFromEntryPoint();\n validationData = _validateSignature(userOp, userOpHash);\n _validateNonce(userOp.nonce);\n _payPrefund(missingAccountFunds);\n }\n\n /**\n * ensure the request comes from the known entrypoint.\n */\n function _requireFromEntryPoint() internal virtual view {\n require(msg.sender == address(entryPoint()), \"account: not from EntryPoint\");\n }\n\n /**\n * validate the signature is valid for this message.\n * @param userOp validate the userOp.signature field\n * @param userOpHash convenient field: the hash of the request, to check the signature against\n * (also hashes the entrypoint and chain id)\n * @return validationData signature and time-range of this operation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal virtual returns (uint256 validationData);\n\n /**\n * Validate the nonce of the UserOperation.\n * This method may validate the nonce requirement of this account.\n * e.g.\n * To limit the nonce to use sequenced UserOps only (no \"out of order\" UserOps):\n * `require(nonce < type(uint64).max)`\n * For a hypothetical account that *requires* the nonce to be out-of-order:\n * `require(nonce & type(uint64).max == 0)`\n *\n * The actual nonce uniqueness is managed by the EntryPoint, and thus no other\n * action is needed by the account itself.\n *\n * @param nonce to validate\n *\n * solhint-disable-next-line no-empty-blocks\n */\n function _validateNonce(uint256 nonce) internal view virtual {\n }\n\n /**\n * sends to the entrypoint (msg.sender) the missing funds for this transaction.\n * subclass MAY override this method for better funds management\n * (e.g. send to the entryPoint more than the minimum required, so that in future transactions\n * it will not be required to send again)\n * @param missingAccountFunds the minimum value this method should send the entrypoint.\n * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\n */\n function _payPrefund(uint256 missingAccountFunds) internal virtual {\n if (missingAccountFunds != 0) {\n (bool success,) = payable(msg.sender).call{value : missingAccountFunds, gas : type(uint256).max}(\"\");\n (success);\n //ignore failure (its EntryPoint's job to verify, not account.)\n }\n }\n}\n"
+ },
+ "contracts/core/BasePaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"./Helpers.sol\";\n\n/**\n * Helper class for creating a paymaster.\n * provides helper methods for staking.\n * validates that the postOp is called only by the entryPoint\n */\nabstract contract BasePaymaster is IPaymaster, Ownable {\n\n IEntryPoint immutable public entryPoint;\n\n constructor(IEntryPoint _entryPoint) {\n entryPoint = _entryPoint;\n }\n\n /// @inheritdoc IPaymaster\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external override returns (bytes memory context, uint256 validationData) {\n _requireFromEntryPoint();\n return _validatePaymasterUserOp(userOp, userOpHash, maxCost);\n }\n\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal virtual returns (bytes memory context, uint256 validationData);\n\n /// @inheritdoc IPaymaster\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override {\n _requireFromEntryPoint();\n _postOp(mode, context, actualGasCost);\n }\n\n /**\n * post-operation handler.\n * (verified to be called only through the entryPoint)\n * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method.\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual {\n\n (mode,context,actualGasCost); // unused params\n // subclass must override this method if validatePaymasterUserOp returns a context\n revert(\"must override\");\n }\n\n /**\n * add a deposit for this paymaster, used for paying for transaction fees\n */\n function deposit() public payable {\n entryPoint.depositTo{value : msg.value}(address(this));\n }\n\n /**\n * withdraw value from the deposit\n * @param withdrawAddress target to send to\n * @param amount to withdraw\n */\n function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\n entryPoint.withdrawTo(withdrawAddress, amount);\n }\n /**\n * add stake for this paymaster.\n * This method can also carry eth value to add to the current stake.\n * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased.\n */\n function addStake(uint32 unstakeDelaySec) external payable onlyOwner {\n entryPoint.addStake{value : msg.value}(unstakeDelaySec);\n }\n\n /**\n * return current paymaster's deposit on the entryPoint.\n */\n function getDeposit() public view returns (uint256) {\n return entryPoint.balanceOf(address(this));\n }\n\n /**\n * unlock the stake, in order to withdraw it.\n * The paymaster can't serve requests once unlocked, until it calls addStake again\n */\n function unlockStake() external onlyOwner {\n entryPoint.unlockStake();\n }\n\n /**\n * withdraw the entire paymaster's stake.\n * stake must be unlocked first (and then wait for the unstakeDelay to be over)\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external onlyOwner {\n entryPoint.withdrawStake(withdrawAddress);\n }\n\n /// validate the call is made from a valid entrypoint\n function _requireFromEntryPoint() internal virtual {\n require(msg.sender == address(entryPoint), \"Sender not EntryPoint\");\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/samples/bls/BLSAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../SimpleAccount.sol\";\nimport \"./IBLSAccount.sol\";\n\n/**\n * Minimal BLS-based account that uses an aggregated signature.\n * The account must maintain its own BLS public key, and expose its trusted signature aggregator.\n * Note that unlike the \"standard\" SimpleAccount, this account can't be called directly\n * (normal SimpleAccount uses its \"signer\" address as both the ecrecover signer, and as a legitimate\n * Ethereum sender address. Obviously, a BLS public key is not a valid Ethereum sender address.)\n */\ncontract BLSAccount is SimpleAccount, IBLSAccount {\n address public immutable aggregator;\n uint256[4] private publicKey;\n\n // The constructor is used only for the \"implementation\" and only sets immutable values.\n // Mutable value slots for proxy accounts are set by the 'initialize' function.\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\n aggregator = anAggregator;\n }\n\n /**\n * The initializer for the BLSAccount instance.\n * @param aPublicKey public key from a BLS keypair that will have a full ownership and control of this account.\n */\n function initialize(uint256[4] memory aPublicKey) public virtual initializer {\n super._initialize(address(0));\n _setBlsPublicKey(aPublicKey);\n }\n\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override view returns (uint256 validationData) {\n\n (userOp, userOpHash);\n if (userOp.initCode.length != 0) {\n // BLSSignatureAggregator.getUserOpPublicKey() assumes that during account creation, the public key is\n // the suffix of the initCode.\n // The account MUST validate it\n bytes32 pubKeyHash = keccak256(abi.encode(getBlsPublicKey()));\n require(keccak256(userOp.initCode[userOp.initCode.length - 128 :]) == pubKeyHash, \"wrong pubkey\");\n }\n return _packValidationData(ValidationData(aggregator, 0,0));\n }\n\n /**\n * Allows the owner to set or change the BLS key.\n * @param newPublicKey public key from a BLS keypair that will have a full ownership and control of this account.\n */\n function setBlsPublicKey(uint256[4] memory newPublicKey) public onlyOwner {\n _setBlsPublicKey(newPublicKey);\n }\n\n function _setBlsPublicKey(uint256[4] memory newPublicKey) internal {\n emit PublicKeyChanged(publicKey, newPublicKey);\n publicKey = newPublicKey;\n }\n\n /// @inheritdoc IBLSAccount\n function getBlsPublicKey() public override view returns (uint256[4] memory) {\n return publicKey;\n }\n}\n"
+ },
+ "contracts/samples/bls/BLSAccountFactory.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\nimport \"../../interfaces/IEntryPoint.sol\";\nimport \"./BLSAccount.sol\";\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * Based on SimpleAccountFactory.\n * Cannot be a subclass since both constructor and createAccount depend on the\n * constructor and initializer of the actual account contract.\n */\ncontract BLSAccountFactory {\n BLSAccount public immutable accountImplementation;\n\n constructor(IEntryPoint entryPoint, address aggregator){\n accountImplementation = new BLSAccount(entryPoint, aggregator);\n }\n\n /**\n * create an account, and return its address.\n * returns the address even if the account is already deployed.\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n * Also note that our BLSSignatureAggregator requires that the public key is the last parameter\n */\n function createAccount(uint256 salt, uint256[4] calldata aPublicKey) public returns (BLSAccount) {\n\n // the BLSSignatureAggregator depends on the public-key being the last 4 uint256 of msg.data.\n uint slot;\n assembly {slot := aPublicKey}\n require(slot == msg.data.length - 128, \"wrong pubkey offset\");\n\n address addr = getAddress(salt, aPublicKey);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return BLSAccount(payable(addr));\n }\n return BLSAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\n address(accountImplementation),\n abi.encodeCall(BLSAccount.initialize, aPublicKey)\n )));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n */\n function getAddress(uint256 salt, uint256[4] memory aPublicKey) public view returns (address) {\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\n type(ERC1967Proxy).creationCode,\n abi.encode(\n address(accountImplementation),\n abi.encodeCall(BLSAccount.initialize, (aPublicKey))\n )\n )));\n }\n}\n"
+ },
+ "contracts/samples/bls/BLSHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n// code taken from : https://github.com/witnet/elliptic-curve-solidity/blob/master/contracts/EllipticCurve.sol\n// missing core functions from \"thehubbleproject/bls\": jacAdd (and sum)\nlibrary BLSHelper {\n\n struct XY {\n uint x;\n uint y;\n }\n /**\n * sum all the points in the array\n * NOTE: the \"ecAdd\" (below) has a special case where x1==y2.\n * @param points an array of bytes32[2], representing an (x,y) of a point\n * @param _pp the modulus of the curve\n * @return ret the sum of all points\n */\n function sum(XY[] memory points, uint256 _pp) internal pure returns (XY memory ret){\n uint x = points[0].x;\n uint y = points[0].y;\n uint z = 1;\n\n for (uint i = 1; i < points.length; i++) {\n (x, y, z) = jacAdd(x, y, z, points[i].x, points[i].y, 1, _pp);\n }\n (x, y) = toAffine(x, y, z, _pp);\n ret.x = x;\n ret.y = y;\n }\n\n /// @dev Adds two points (x1, y1, z1) and (x2, y2, z2).\n /// @param _x1 coordinate x of P1\n /// @param _y1 coordinate y of P1\n /// @param _z1 coordinate z of P1\n /// @param _x2 coordinate x of square\n /// @param _y2 coordinate y of square\n /// @param _z2 coordinate z of square\n /// @param _pp the modulus\n /// @return (qx, qy, qz) P1+square in Jacobian\n function jacAdd(\n uint256 _x1,\n uint256 _y1,\n uint256 _z1,\n uint256 _x2,\n uint256 _y2,\n uint256 _z2,\n uint256 _pp)\n internal pure returns (uint256, uint256, uint256)\n {\n if (_x1 == 0 && _y1 == 0)\n return (_x2, _y2, _z2);\n if (_x2 == 0 && _y2 == 0)\n return (_x1, _y1, _z1);\n\n // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5\n uint[4] memory zs;\n // z1^2, z1^3, z2^2, z2^3\n zs[0] = mulmod(_z1, _z1, _pp);\n zs[1] = mulmod(_z1, zs[0], _pp);\n zs[2] = mulmod(_z2, _z2, _pp);\n zs[3] = mulmod(_z2, zs[2], _pp);\n\n // u1, s1, u2, s2\n zs = [\n mulmod(_x1, zs[2], _pp),\n mulmod(_y1, zs[3], _pp),\n mulmod(_x2, zs[0], _pp),\n mulmod(_y2, zs[1], _pp)\n ];\n\n // In case of zs[0] == zs[2] && zs[1] == zs[3], double function should be used\n require(zs[0] != zs[2] || zs[1] != zs[3], \"Use jacDouble function instead\");\n\n uint[4] memory hr;\n //h\n hr[0] = addmod(zs[2], _pp - zs[0], _pp);\n //r\n hr[1] = addmod(zs[3], _pp - zs[1], _pp);\n //h^2\n hr[2] = mulmod(hr[0], hr[0], _pp);\n // h^3\n hr[3] = mulmod(hr[2], hr[0], _pp);\n // qx = -h^3 -2u1h^2+r^2\n uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp);\n qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp);\n // qy = -s1*z1*h^3+r(u1*h^2 -x^3)\n uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp);\n qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp);\n // qz = h*z1*z2\n uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp);\n return (qx, qy, qz);\n }\n\n\n /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1).\n /// @param _x coordinate x\n /// @param _y coordinate y\n /// @param _z coordinate z\n /// @param _pp the modulus\n /// @return (x', y') affine coordinates\n function toAffine(\n uint256 _x,\n uint256 _y,\n uint256 _z,\n uint256 _pp)\n internal pure returns (uint256, uint256)\n {\n uint256 zInv = invMod(_z, _pp);\n uint256 zInv2 = mulmod(zInv, zInv, _pp);\n uint256 x2 = mulmod(_x, zInv2, _pp);\n uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp);\n\n return (x2, y2);\n }\n\n\n /// @dev Modular euclidean inverse of a number (mod p).\n /// @param _x The number\n /// @param _pp The modulus\n /// @return q such that x*q = 1 (mod _pp)\n function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) {\n require(_x != 0 && _x != _pp && _pp != 0, \"Invalid number\");\n uint256 q = 0;\n uint256 newT = 1;\n uint256 r = _pp;\n uint256 t;\n while (_x != 0) {\n t = r / _x;\n (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp));\n (r, _x) = (_x, r - t * _x);\n }\n\n return q;\n }\n\n /// @dev Doubles a point (x, y, z).\n /// @param _x coordinate x of P1\n /// @param _y coordinate y of P1\n /// @param _z coordinate z of P1\n /// @param _aa the a scalar in the curve equation\n /// @param _pp the modulus\n /// @return (qx, qy, qz) 2P in Jacobian\n function jacDouble(\n uint256 _x,\n uint256 _y,\n uint256 _z,\n uint256 _aa,\n uint256 _pp)\n internal pure returns (uint256, uint256, uint256)\n {\n if (_z == 0)\n return (_x, _y, _z);\n\n // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5\n // Note: there is a bug in the paper regarding the m parameter, M=3*(x1^2)+a*(z1^4)\n // x, y, z at this point represent the squares of _x, _y, _z\n uint256 x = mulmod(_x, _x, _pp); //x1^2\n uint256 y = mulmod(_y, _y, _pp); //y1^2\n uint256 z = mulmod(_z, _z, _pp); //z1^2\n\n // s\n uint s = mulmod(4, mulmod(_x, y, _pp), _pp);\n // m\n uint m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp);\n\n // x, y, z at this point will be reassigned and rather represent qx, qy, qz from the paper\n // This allows to reduce the gas cost and stack footprint of the algorithm\n // qx\n x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp);\n // qy = -8*y1^4 + M(S-T)\n y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp);\n // qz = 2*y1*z1\n z = mulmod(2, mulmod(_y, _z, _pp), _pp);\n\n return (x, y, z);\n }\n\n /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates.\n /// @param _x1 coordinate x of P1\n /// @param _y1 coordinate y of P1\n /// @param _x2 coordinate x of P2\n /// @param _y2 coordinate y of P2\n /// @param _aa constant of the curve\n /// @param _pp the modulus\n /// @return (qx, qy) = P1+P2 in affine coordinates\n function ecAdd(\n uint256 _x1,\n uint256 _y1,\n uint256 _x2,\n uint256 _y2,\n uint256 _aa,\n uint256 _pp)\n internal pure returns (uint256, uint256)\n {\n uint x = 0;\n uint y = 0;\n uint z = 0;\n\n // Double if x1==x2 else add\n if (_x1 == _x2) {\n // y1 = -y2 mod p\n if (addmod(_y1, _y2, _pp) == 0) {\n return (0, 0);\n } else {\n // P1 = P2\n (x, y, z) = jacDouble(\n _x1,\n _y1,\n 1,\n _aa,\n _pp);\n }\n } else {\n (x, y, z) = jacAdd(\n _x1,\n _y1,\n 1,\n _x2,\n _y2,\n 1,\n _pp);\n }\n // Get back to affine\n return toAffine(\n x,\n y,\n z,\n _pp);\n }\n\n}\n"
+ },
+ "contracts/samples/bls/BLSSignatureAggregator.sol": {
+ "content": "//SPDX-License-Identifier: Unlicense\npragma solidity >=0.8.4 <0.9.0;\npragma abicoder v2;\n\nimport \"../../interfaces/IAggregator.sol\";\nimport \"../../interfaces/IEntryPoint.sol\";\nimport {BLSOpen} from \"./lib/BLSOpen.sol\";\nimport \"./IBLSAccount.sol\";\nimport \"./BLSHelper.sol\";\n\n/**\n * A BLS-based signature aggregator, to validate aggregated signature of multiple UserOps if BLSAccount\n */\ncontract BLSSignatureAggregator is IAggregator {\n using UserOperationLib for UserOperation;\n\n bytes32 public constant BLS_DOMAIN = keccak256(\"eip4337.bls.domain\");\n\n //copied from BLS.sol\n uint256 public constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n /**\n * @return publicKey - the public key from a BLS keypair the Aggregator will use to verify this UserOp;\n * normally public key will be queried from the deployed BLSAccount itself;\n * the public key will be read from the 'initCode' if the account is not deployed yet;\n */\n function getUserOpPublicKey(UserOperation memory userOp) public view returns (uint256[4] memory publicKey) {\n bytes memory initCode = userOp.initCode;\n if (initCode.length > 0) {\n publicKey = getTrailingPublicKey(initCode);\n } else {\n return IBLSAccount(userOp.sender).getBlsPublicKey{gas : 50000}();\n }\n }\n\n /**\n * return the trailing 4 words of input data\n */\n function getTrailingPublicKey(bytes memory data) public pure returns (uint256[4] memory publicKey) {\n uint len = data.length;\n require(len > 32 * 4, \"data too short for sig\");\n\n /* solhint-disable-next-line no-inline-assembly */\n assembly {\n // actual buffer starts at data+32, so last 128 bytes start at data+32+len-128 = data+len-96\n let ofs := sub(add(data, len), 96)\n mstore(publicKey, mload(ofs))\n mstore(add(publicKey, 32), mload(add(ofs, 32)))\n mstore(add(publicKey, 64), mload(add(ofs, 64)))\n mstore(add(publicKey, 96), mload(add(ofs, 96)))\n }\n }\n\n /// @inheritdoc IAggregator\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature)\n external view override {\n require(signature.length == 64, \"BLS: invalid signature\");\n (uint256[2] memory blsSignature) = abi.decode(signature, (uint256[2]));\n\n uint userOpsLen = userOps.length;\n uint256[4][] memory blsPublicKeys = new uint256[4][](userOpsLen);\n uint256[2][] memory messages = new uint256[2][](userOpsLen);\n for (uint256 i = 0; i < userOpsLen; i++) {\n\n UserOperation memory userOp = userOps[i];\n blsPublicKeys[i] = getUserOpPublicKey(userOp);\n\n messages[i] = _userOpToMessage(userOp, _getPublicKeyHash(blsPublicKeys[i]));\n }\n require(BLSOpen.verifyMultiple(blsSignature, blsPublicKeys, messages), \"BLS: validateSignatures failed\");\n }\n\n /**\n * get a hash of userOp\n * NOTE: this hash is not the same as UserOperation.hash()\n * (slightly less efficient, since it uses memory userOp)\n */\n function internalUserOpHash(UserOperation memory userOp) internal pure returns (bytes32) {\n return keccak256(abi.encode(\n userOp.sender,\n userOp.nonce,\n keccak256(userOp.initCode),\n keccak256(userOp.callData),\n userOp.callGasLimit,\n userOp.verificationGasLimit,\n userOp.preVerificationGas,\n userOp.maxFeePerGas,\n userOp.maxPriorityFeePerGas,\n keccak256(userOp.paymasterAndData)\n ));\n }\n\n /**\n * return the BLS \"message\" for the given UserOp.\n * the account checks the signature over this value using its public key\n */\n function userOpToMessage(UserOperation memory userOp) public view returns (uint256[2] memory) {\n bytes32 publicKeyHash = _getPublicKeyHash(getUserOpPublicKey(userOp));\n return _userOpToMessage(userOp, publicKeyHash);\n }\n\n function _userOpToMessage(UserOperation memory userOp, bytes32 publicKeyHash) internal view returns (uint256[2] memory) {\n bytes32 userOpHash = _getUserOpHash(userOp, publicKeyHash);\n return BLSOpen.hashToPoint(BLS_DOMAIN, abi.encodePacked(userOpHash));\n }\n\n // helper for test\n function getUserOpHash(UserOperation memory userOp) public view returns (bytes32) {\n bytes32 publicKeyHash = _getPublicKeyHash(getUserOpPublicKey(userOp));\n return _getUserOpHash(userOp, publicKeyHash);\n }\n\n function _getUserOpHash(UserOperation memory userOp, bytes32 publicKeyHash) internal view returns (bytes32) {\n return keccak256(abi.encode(internalUserOpHash(userOp), publicKeyHash, address(this), block.chainid));\n }\n\n function _getPublicKeyHash(uint256[4] memory publicKey) internal pure returns(bytes32) {\n return keccak256(abi.encode(publicKey));\n }\n /**\n * validate signature of a single userOp\n * This method is called after EntryPoint.simulateValidation() returns an aggregator.\n * First it validates the signature over the userOp. then it return data to be used when creating the handleOps:\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp) {\n uint256[2] memory signature = abi.decode(userOp.signature, (uint256[2]));\n uint256[4] memory pubkey = getUserOpPublicKey(userOp);\n uint256[2] memory message = _userOpToMessage(userOp, _getPublicKeyHash(pubkey));\n\n require(BLSOpen.verifySingle(signature, pubkey, message), \"BLS: wrong sig\");\n return \"\";\n }\n\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external pure returns (bytes memory aggregatedSignature) {\n BLSHelper.XY[] memory points = new BLSHelper.XY[](userOps.length);\n for (uint i = 0; i < points.length; i++) {\n (uint256 x, uint256 y) = abi.decode(userOps[i].signature, (uint256, uint256));\n points[i] = BLSHelper.XY(x, y);\n }\n BLSHelper.XY memory sum = BLSHelper.sum(points, N);\n return abi.encode(sum.x, sum.y);\n }\n\n /**\n * allow staking for this aggregator\n * there is no limit on stake or delay, but it is not a problem, since it is a permissionless\n * signature aggregator, which doesn't support unstaking.\n */\n function addStake(IEntryPoint entryPoint, uint32 delay) external payable {\n entryPoint.addStake{value : msg.value}(delay);\n }\n}\n"
+ },
+ "contracts/samples/bls/IBLSAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity >=0.7.6;\n\nimport \"../../interfaces/IAccount.sol\";\n\n/**\n * a BLS account should expose its own public key.\n */\ninterface IBLSAccount is IAccount {\n event PublicKeyChanged(uint256[4] oldPublicKey, uint256[4] newPublicKey);\n\n /**\n * @return public key from a BLS keypair that is used to verify the BLS signature, both separately and aggregated.\n */\n function getBlsPublicKey() external view returns (uint256[4] memory);\n}\n"
+ },
+ "contracts/samples/bls/lib/BLSOpen.sol": {
+ "content": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.6.12;\n\nimport { BLS } from \"./hubble-contracts/contracts/libs/BLS.sol\";\n\nlibrary BLSOpen {\n function verifySingle(\n uint256[2] memory signature,\n uint256[4] memory pubkey,\n uint256[2] memory message\n ) external view returns (bool) {\n uint256[4][] memory pubkeys = new uint256[4][](1);\n uint256[2][] memory messages = new uint256[2][](1);\n pubkeys[0] = pubkey;\n messages[0] = message;\n\n (bool verified, bool callSuccess) = BLS.verifyMultiple(\n signature,\n pubkeys,\n messages\n );\n return callSuccess && verified;\n\n // // NB: (result, success) opposite of `call` convention (success, result).\n // (bool verified, bool callSuccess) = BLS.verifySingle(\n // signature,\n // pubkey,\n // message\n // );\n // return callSuccess && verified;\n }\n\n function verifyMultiple(\n uint256[2] memory signature,\n uint256[4][] memory pubkeys,\n uint256[2][] memory messages\n ) external view returns (bool) {\n (bool verified, bool callSuccess) = BLS.verifyMultiple(\n signature,\n pubkeys,\n messages\n );\n return callSuccess && verified;\n }\n\n function hashToPoint(\n bytes32 domain,\n bytes memory message\n ) external view returns (uint256[2] memory) {\n return BLS.hashToPoint(\n domain,\n message\n );\n }\n\n function isZeroBLSKey(uint256[4] memory blsKey) public pure returns (bool) {\n bool isZero = true;\n for (uint256 i=0; isZero && i<4; i++) {\n isZero = (blsKey[i] == 0);\n }\n return isZero;\n }\n\n}\n"
+ },
+ "contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol": {
+ "content": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.6.12;\n\nimport { ModexpInverse, ModexpSqrt } from \"./ModExp.sol\";\nimport {\n BNPairingPrecompileCostEstimator\n} from \"./BNPairingPrecompileCostEstimator.sol\";\n\n/**\n @title Boneh–Lynn–Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254)\n @notice We use BLS signature aggregation to reduce the size of signature data to store on chain.\n @dev We use G1 points for signatures and messages, and G2 points for public keys\n */\nlibrary BLS {\n // Field order\n // prettier-ignore\n uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n // Negated genarator of G2\n // prettier-ignore\n uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n // prettier-ignore\n uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n // prettier-ignore\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\n // prettier-ignore\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\n\n // sqrt(-3)\n // prettier-ignore\n uint256 private constant Z0 = 0x0000000000000000b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd;\n // (sqrt(-3) - 1) / 2\n // prettier-ignore\n uint256 private constant Z1 = 0x000000000000000059e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe;\n\n // prettier-ignore\n uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000;\n // prettier-ignore\n uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff;\n\n // estimator address\n// address private constant COST_ESTIMATOR_ADDRESS = new 0x22E4a5251C1F02de8369Dd6f192033F6CB7531A4;\n\n function verifySingle(\n uint256[2] memory signature,\n uint256[4] memory pubkey,\n uint256[2] memory message\n ) internal view returns (bool, bool) {\n uint256[12] memory input =\n [\n signature[0],\n signature[1],\n N_G2_X1,\n N_G2_X0,\n N_G2_Y1,\n N_G2_Y0,\n message[0],\n message[1],\n pubkey[1],\n pubkey[0],\n pubkey[3],\n pubkey[2]\n ];\n uint256[1] memory out;\n uint256 precompileGasCost = gasleft();\n// BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(\n// 2\n// );\n bool callSuccess;\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n callSuccess := staticcall(\n precompileGasCost,\n 8,\n input,\n 384,\n out,\n 0x20\n )\n }\n if (!callSuccess) {\n return (false, false);\n }\n return (out[0] != 0, true);\n }\n\n function verifyMultiple(\n uint256[2] memory signature,\n uint256[4][] memory pubkeys,\n uint256[2][] memory messages\n ) internal view returns (bool checkResult, bool callSuccess) {\n uint256 size = pubkeys.length;\n require(size > 0, \"BLS: number of public key is zero\");\n require(\n size == messages.length,\n \"BLS: number of public keys and messages must be equal\"\n );\n uint256 inputSize = (size + 1) * 6;\n uint256[] memory input = new uint256[](inputSize);\n input[0] = signature[0];\n input[1] = signature[1];\n input[2] = N_G2_X1;\n input[3] = N_G2_X0;\n input[4] = N_G2_Y1;\n input[5] = N_G2_Y0;\n for (uint256 i = 0; i < size; i++) {\n input[i * 6 + 6] = messages[i][0];\n input[i * 6 + 7] = messages[i][1];\n input[i * 6 + 8] = pubkeys[i][1];\n input[i * 6 + 9] = pubkeys[i][0];\n input[i * 6 + 10] = pubkeys[i][3];\n input[i * 6 + 11] = pubkeys[i][2];\n }\n uint256[1] memory out;\n\n // prettier-ignore\n uint256 precompileGasCost = gasleft();\n// uint256 precompileGasCost = BNPairingPrecompileCostEstimator(COST_ESTIMATOR_ADDRESS).getGasCost(size + 1);\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n callSuccess := staticcall(\n precompileGasCost,\n 8,\n add(input, 0x20),\n mul(inputSize, 0x20),\n out,\n 0x20\n )\n }\n if (!callSuccess) {\n return (false, false);\n }\n return (out[0] != 0, true);\n }\n\n /**\n @notice Fouque-Tibouchi Hash to Curve\n */\n function hashToPoint(bytes32 domain, bytes memory message)\n internal\n view\n returns (uint256[2] memory)\n {\n uint256[2] memory u = hashToField(domain, message);\n uint256[2] memory p0 = mapToPoint(u[0]);\n uint256[2] memory p1 = mapToPoint(u[1]);\n uint256[4] memory bnAddInput;\n bnAddInput[0] = p0[0];\n bnAddInput[1] = p0[1];\n bnAddInput[2] = p1[0];\n bnAddInput[3] = p1[1];\n bool success;\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n success := staticcall(sub(gas(), 2000), 6, bnAddInput, 128, p0, 64)\n switch success\n case 0 {\n invalid()\n }\n }\n require(success, \"BLS: bn add call failed\");\n return p0;\n }\n\n function mapToPoint(uint256 _x)\n internal\n pure\n returns (uint256[2] memory p)\n {\n require(_x < N, \"mapToPointFT: invalid field element\");\n uint256 x = _x;\n\n (, bool decision) = sqrt(x);\n\n uint256 a0 = mulmod(x, x, N);\n a0 = addmod(a0, 4, N);\n uint256 a1 = mulmod(x, Z0, N);\n uint256 a2 = mulmod(a1, a0, N);\n a2 = inverse(a2);\n a1 = mulmod(a1, a1, N);\n a1 = mulmod(a1, a2, N);\n\n // x1\n a1 = mulmod(x, a1, N);\n x = addmod(Z1, N - a1, N);\n // check curve\n a1 = mulmod(x, x, N);\n a1 = mulmod(a1, x, N);\n a1 = addmod(a1, 3, N);\n bool found;\n (a1, found) = sqrt(a1);\n if (found) {\n if (!decision) {\n a1 = N - a1;\n }\n return [x, a1];\n }\n\n // x2\n x = N - addmod(x, 1, N);\n // check curve\n a1 = mulmod(x, x, N);\n a1 = mulmod(a1, x, N);\n a1 = addmod(a1, 3, N);\n (a1, found) = sqrt(a1);\n if (found) {\n if (!decision) {\n a1 = N - a1;\n }\n return [x, a1];\n }\n\n // x3\n x = mulmod(a0, a0, N);\n x = mulmod(x, x, N);\n x = mulmod(x, a2, N);\n x = mulmod(x, a2, N);\n x = addmod(x, 1, N);\n // must be on curve\n a1 = mulmod(x, x, N);\n a1 = mulmod(a1, x, N);\n a1 = addmod(a1, 3, N);\n (a1, found) = sqrt(a1);\n require(found, \"BLS: bad ft mapping implementation\");\n if (!decision) {\n a1 = N - a1;\n }\n return [x, a1];\n }\n\n function isValidSignature(uint256[2] memory signature)\n internal\n pure\n returns (bool)\n {\n if ((signature[0] >= N) || (signature[1] >= N)) {\n return false;\n } else {\n return isOnCurveG1(signature);\n }\n }\n\n function isOnCurveG1(uint256[2] memory point)\n internal\n pure\n returns (bool _isOnCurve)\n {\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let t0 := mload(point)\n let t1 := mload(add(point, 32))\n let t2 := mulmod(t0, t0, N)\n t2 := mulmod(t2, t0, N)\n t2 := addmod(t2, 3, N)\n t1 := mulmod(t1, t1, N)\n _isOnCurve := eq(t1, t2)\n }\n }\n\n function isOnCurveG2(uint256[4] memory point)\n internal\n pure\n returns (bool _isOnCurve)\n {\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n // x0, x1\n let t0 := mload(point)\n let t1 := mload(add(point, 32))\n // x0 ^ 2\n let t2 := mulmod(t0, t0, N)\n // x1 ^ 2\n let t3 := mulmod(t1, t1, N)\n // 3 * x0 ^ 2\n let t4 := add(add(t2, t2), t2)\n // 3 * x1 ^ 2\n let t5 := addmod(add(t3, t3), t3, N)\n // x0 * (x0 ^ 2 - 3 * x1 ^ 2)\n t2 := mulmod(add(t2, sub(N, t5)), t0, N)\n // x1 * (3 * x0 ^ 2 - x1 ^ 2)\n t3 := mulmod(add(t4, sub(N, t3)), t1, N)\n\n // x ^ 3 + b\n t0 := addmod(\n t2,\n 0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5,\n N\n )\n t1 := addmod(\n t3,\n 0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2,\n N\n )\n\n // y0, y1\n t2 := mload(add(point, 64))\n t3 := mload(add(point, 96))\n // y ^ 2\n t4 := mulmod(addmod(t2, t3, N), addmod(t2, sub(N, t3), N), N)\n t3 := mulmod(shl(1, t2), t3, N)\n\n // y ^ 2 == x ^ 3 + b\n _isOnCurve := and(eq(t0, t4), eq(t1, t3))\n }\n }\n\n function sqrt(uint256 xx) internal pure returns (uint256 x, bool hasRoot) {\n x = ModexpSqrt.run(xx);\n hasRoot = mulmod(x, x, N) == xx;\n }\n\n function inverse(uint256 a) internal pure returns (uint256) {\n return ModexpInverse.run(a);\n }\n\n function hashToField(bytes32 domain, bytes memory messages)\n internal\n pure\n returns (uint256[2] memory)\n {\n bytes memory _msg = expandMsgTo96(domain, messages);\n uint256 u0;\n uint256 u1;\n uint256 a0;\n uint256 a1;\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let p := add(_msg, 24)\n u1 := and(mload(p), MASK24)\n p := add(_msg, 48)\n u0 := and(mload(p), MASK24)\n a0 := addmod(mulmod(u1, T24, N), u0, N)\n p := add(_msg, 72)\n u1 := and(mload(p), MASK24)\n p := add(_msg, 96)\n u0 := and(mload(p), MASK24)\n a1 := addmod(mulmod(u1, T24, N), u0, N)\n }\n return [a0, a1];\n }\n\n function expandMsgTo96(bytes32 domain, bytes memory message)\n internal\n pure\n returns (bytes memory)\n {\n // zero<64>|msg|lib_str<2>|I2OSP(0, 1)<1>|dst|dst_len<1>\n uint256 t0 = message.length;\n bytes memory msg0 = new bytes(32 + t0 + 64 + 4);\n bytes memory out = new bytes(96);\n // b0\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let p := add(msg0, 96)\n for {\n let z := 0\n } lt(z, t0) {\n z := add(z, 32)\n } {\n mstore(add(p, z), mload(add(message, add(z, 32))))\n }\n p := add(p, t0)\n\n mstore8(p, 0)\n p := add(p, 1)\n mstore8(p, 96)\n p := add(p, 1)\n mstore8(p, 0)\n p := add(p, 1)\n\n mstore(p, domain)\n p := add(p, 32)\n mstore8(p, 32)\n }\n bytes32 b0 = sha256(msg0);\n bytes32 bi;\n t0 = 32 + 34;\n\n // resize intermediate message\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(msg0, t0)\n }\n\n // b1\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(add(msg0, 32), b0)\n mstore8(add(msg0, 64), 1)\n mstore(add(msg0, 65), domain)\n mstore8(add(msg0, add(32, 65)), 32)\n }\n\n bi = sha256(msg0);\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(add(out, 32), bi)\n }\n\n // b2\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let t := xor(b0, bi)\n mstore(add(msg0, 32), t)\n mstore8(add(msg0, 64), 2)\n mstore(add(msg0, 65), domain)\n mstore8(add(msg0, add(32, 65)), 32)\n }\n\n bi = sha256(msg0);\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(add(out, 64), bi)\n }\n\n // b3\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let t := xor(b0, bi)\n mstore(add(msg0, 32), t)\n mstore8(add(msg0, 64), 3)\n mstore(add(msg0, 65), domain)\n mstore8(add(msg0, add(32, 65)), 32)\n }\n\n bi = sha256(msg0);\n\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n mstore(add(out, 96), bi)\n }\n\n return out;\n }\n}\n"
+ },
+ "contracts/samples/bls/lib/hubble-contracts/contracts/libs/BNPairingPrecompileCostEstimator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.6.12;\n\ncontract BNPairingPrecompileCostEstimator {\n uint256 public baseCost;\n uint256 public perPairCost;\n\n // G1 Generator\n uint256 private constant G1_X = 1;\n uint256 private constant G1_Y = 2;\n\n // G2 genarator\n // prettier-ignore\n uint256 private constant G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n // prettier-ignore\n uint256 private constant G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n // prettier-ignore\n uint256 private constant G2_Y0 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n // prettier-ignore\n uint256 private constant G2_Y1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n\n // G2 negated genarator y coordinates\n // prettier-ignore\n uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;\n // prettier-ignore\n uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;\n\n function run() external {\n _run();\n }\n\n function getGasCost(uint256 pairCount) external view returns (uint256) {\n return pairCount * perPairCost + baseCost;\n }\n\n function _run() internal {\n uint256 gasCost1Pair = _gasCost1Pair();\n uint256 gasCost2Pair = _gasCost2Pair();\n perPairCost = gasCost2Pair - gasCost1Pair;\n baseCost = gasCost1Pair - perPairCost;\n }\n\n function _gasCost1Pair() internal view returns (uint256) {\n uint256[6] memory input = [G1_X, G1_Y, G2_X1, G2_X0, G2_Y1, G2_Y0];\n uint256[1] memory out;\n bool callSuccess;\n uint256 suppliedGas = gasleft() - 2000;\n require(\n gasleft() > 2000,\n \"BNPairingPrecompileCostEstimator: not enough gas, single pair\"\n );\n uint256 gasT0 = gasleft();\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n callSuccess := staticcall(suppliedGas, 8, input, 192, out, 0x20)\n }\n uint256 gasCost = gasT0 - gasleft();\n require(\n callSuccess,\n \"BNPairingPrecompileCostEstimator: single pair call is failed\"\n );\n require(\n out[0] == 0,\n \"BNPairingPrecompileCostEstimator: single pair call result must be 0\"\n );\n return gasCost;\n }\n\n function _gasCost2Pair() internal view returns (uint256) {\n uint256[12] memory input =\n [\n G1_X,\n G1_Y,\n G2_X1,\n G2_X0,\n G2_Y1,\n G2_Y0,\n G1_X,\n G1_Y,\n G2_X1,\n G2_X0,\n N_G2_Y1,\n N_G2_Y0\n ];\n uint256[1] memory out;\n bool callSuccess;\n uint256 suppliedGas = gasleft() - 2000;\n require(\n gasleft() > 2000,\n \"BNPairingPrecompileCostEstimator: not enough gas, couple pair\"\n );\n uint256 gasT0 = gasleft();\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n callSuccess := staticcall(suppliedGas, 8, input, 384, out, 0x20)\n }\n uint256 gasCost = gasT0 - gasleft();\n require(\n callSuccess,\n \"BNPairingPrecompileCostEstimator: couple pair call is failed\"\n );\n require(\n out[0] == 1,\n \"BNPairingPrecompileCostEstimator: couple pair call result must be 1\"\n );\n return gasCost;\n }\n}\n"
+ },
+ "contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol": {
+ "content": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.6.12;\n\n/**\n @title Compute Inverse by Modular Exponentiation\n @notice Compute $input^(N - 2) mod N$ using Addition Chain method.\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\n and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45\n @dev the function body is generated with the modified addchain script\n see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f\n */\nlibrary ModexpInverse {\n function run(uint256 t2) internal pure returns (uint256 t0) {\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let\n n\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\n t0 := mulmod(t2, t2, n)\n let t5 := mulmod(t0, t2, n)\n let t1 := mulmod(t5, t0, n)\n let t3 := mulmod(t5, t5, n)\n let t8 := mulmod(t1, t0, n)\n let t4 := mulmod(t3, t5, n)\n let t6 := mulmod(t3, t1, n)\n t0 := mulmod(t3, t3, n)\n let t7 := mulmod(t8, t3, n)\n t3 := mulmod(t4, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n }\n }\n}\n\n/**\n @title Compute Squre Root by Modular Exponentiation\n @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method.\n Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\n and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52\n */\nlibrary ModexpSqrt {\n function run(uint256 t6) internal pure returns (uint256 t0) {\n // solium-disable-next-line security/no-inline-assembly\n assembly {\n let\n n\n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47\n\n t0 := mulmod(t6, t6, n)\n let t4 := mulmod(t0, t6, n)\n let t2 := mulmod(t4, t0, n)\n let t3 := mulmod(t4, t4, n)\n let t8 := mulmod(t2, t0, n)\n let t1 := mulmod(t3, t4, n)\n let t5 := mulmod(t3, t2, n)\n t0 := mulmod(t3, t3, n)\n let t7 := mulmod(t8, t3, n)\n t3 := mulmod(t1, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t8, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t7, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t6, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t5, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t4, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t3, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t2, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t0, n)\n t0 := mulmod(t0, t1, n)\n t0 := mulmod(t0, t0, n)\n }\n }\n}\n"
+ },
+ "contracts/samples/callback/TokenCallbackHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-empty-blocks */\n\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport \"@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\";\nimport \"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\";\n\n/**\n * Token callback handler.\n * Handles supported tokens' callbacks, allowing account receiving these tokens.\n */\ncontract TokenCallbackHandler is IERC777Recipient, IERC721Receiver, IERC1155Receiver {\n function tokensReceived(\n address,\n address,\n address,\n uint256,\n bytes calldata,\n bytes calldata\n ) external pure override {\n }\n\n function onERC721Received(\n address,\n address,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC721Receiver.onERC721Received.selector;\n }\n\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC1155Receiver.onERC1155Received.selector;\n }\n\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] calldata,\n uint256[] calldata,\n bytes calldata\n ) external pure override returns (bytes4) {\n return IERC1155Receiver.onERC1155BatchReceived.selector;\n }\n\n function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) {\n return\n interfaceId == type(IERC721Receiver).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "contracts/samples/DepositPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"../core/BasePaymaster.sol\";\nimport \"./IOracle.sol\";\n\n/**\n * A token-based paymaster that accepts token deposits\n * The deposit is only a safeguard: the user pays with his token balance.\n * only if the user didn't approve() the paymaster, or if the token balance is not enough, the deposit will be used.\n * thus the required deposit is to cover just one method call.\n * The deposit is locked for the current block: the user must issue unlockTokenDeposit() to be allowed to withdraw\n * (but can't use the deposit for this or further operations)\n *\n * paymasterAndData holds the paymaster address followed by the token address to use.\n * @notice This paymaster will be rejected by the standard rules of EIP4337, as it uses an external oracle.\n * (the standard rules ban accessing data of an external contract)\n * It can only be used if it is \"whitelisted\" by the bundler.\n * (technically, it can be used by an \"oracle\" which returns a static value, without accessing any storage)\n */\ncontract DepositPaymaster is BasePaymaster {\n\n using UserOperationLib for UserOperation;\n using SafeERC20 for IERC20;\n\n //calculated cost of the postOp\n uint256 constant public COST_OF_POST = 35000;\n\n IOracle private constant NULL_ORACLE = IOracle(address(0));\n mapping(IERC20 => IOracle) public oracles;\n mapping(IERC20 => mapping(address => uint256)) public balances;\n mapping(address => uint256) public unlockBlock;\n\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\n //owner account is unblocked, to allow withdraw of paid tokens;\n unlockTokenDeposit();\n }\n\n /**\n * owner of the paymaster should add supported tokens\n */\n function addToken(IERC20 token, IOracle tokenPriceOracle) external onlyOwner {\n require(oracles[token] == NULL_ORACLE, \"Token already set\");\n oracles[token] = tokenPriceOracle;\n }\n\n /**\n * deposit tokens that a specific account can use to pay for gas.\n * The sender must first approve this paymaster to withdraw these tokens (they are only withdrawn in this method).\n * Note depositing the tokens is equivalent to transferring them to the \"account\" - only the account can later\n * use them - either as gas, or using withdrawTo()\n *\n * @param token the token to deposit.\n * @param account the account to deposit for.\n * @param amount the amount of token to deposit.\n */\n function addDepositFor(IERC20 token, address account, uint256 amount) external {\n //(sender must have approval for the paymaster)\n token.safeTransferFrom(msg.sender, address(this), amount);\n require(oracles[token] != NULL_ORACLE, \"unsupported token\");\n balances[token][account] += amount;\n if (msg.sender == account) {\n lockTokenDeposit();\n }\n }\n\n /**\n * @return amount - the amount of given token deposited to the Paymaster.\n * @return _unlockBlock - the block height at which the deposit can be withdrawn.\n */\n function depositInfo(IERC20 token, address account) public view returns (uint256 amount, uint256 _unlockBlock) {\n amount = balances[token][account];\n _unlockBlock = unlockBlock[account];\n }\n\n /**\n * unlock deposit, so that it can be withdrawn.\n * can't be called in the same block as withdrawTo()\n */\n function unlockTokenDeposit() public {\n unlockBlock[msg.sender] = block.number;\n }\n\n /**\n * lock the tokens deposited for this account so they can be used to pay for gas.\n * after calling unlockTokenDeposit(), the account can't use this paymaster until the deposit is locked.\n */\n function lockTokenDeposit() public {\n unlockBlock[msg.sender] = 0;\n }\n\n /**\n * withdraw tokens.\n * can only be called after unlock() is called in a previous block.\n * @param token the token deposit to withdraw\n * @param target address to send to\n * @param amount amount to withdraw\n */\n function withdrawTokensTo(IERC20 token, address target, uint256 amount) public {\n require(unlockBlock[msg.sender] != 0 && block.number > unlockBlock[msg.sender], \"DepositPaymaster: must unlockTokenDeposit\");\n balances[token][msg.sender] -= amount;\n token.safeTransfer(target, amount);\n }\n\n /**\n * translate the given eth value to token amount\n * @param token the token to use\n * @param ethBought the required eth value we want to \"buy\"\n * @return requiredTokens the amount of tokens required to get this amount of eth\n */\n function getTokenValueOfEth(IERC20 token, uint256 ethBought) internal view virtual returns (uint256 requiredTokens) {\n IOracle oracle = oracles[token];\n require(oracle != NULL_ORACLE, \"DepositPaymaster: unsupported token\");\n return oracle.getTokenValueOfEth(ethBought);\n }\n\n /**\n * Validate the request:\n * The sender should have enough deposit to pay the max possible cost.\n * Note that the sender's balance is not checked. If it fails to pay from its balance,\n * this deposit will be used to compensate the paymaster for the transaction.\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal view override returns (bytes memory context, uint256 validationData) {\n\n (userOpHash);\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\n require(userOp.verificationGasLimit > COST_OF_POST, \"DepositPaymaster: gas too low for postOp\");\n\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n require(paymasterAndData.length == 20+20, \"DepositPaymaster: paymasterAndData must specify token\");\n IERC20 token = IERC20(address(bytes20(paymasterAndData[20:])));\n address account = userOp.getSender();\n uint256 maxTokenCost = getTokenValueOfEth(token, maxCost);\n uint256 gasPriceUserOp = userOp.gasPrice();\n require(unlockBlock[account] == 0, \"DepositPaymaster: deposit not locked\");\n require(balances[token][account] >= maxTokenCost, \"DepositPaymaster: deposit too low\");\n return (abi.encode(account, token, gasPriceUserOp, maxTokenCost, maxCost),0);\n }\n\n /**\n * perform the post-operation to charge the sender for the gas.\n * in normal mode, use transferFrom to withdraw enough tokens from the sender's balance.\n * in case the transferFrom fails, the _postOp reverts and the entryPoint will call it again,\n * this time in *postOpReverted* mode.\n * In this mode, we use the deposit to pay (which we validated to be large enough)\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\n\n (address account, IERC20 token, uint256 gasPricePostOp, uint256 maxTokenCost, uint256 maxCost) = abi.decode(context, (address, IERC20, uint256, uint256, uint256));\n //use same conversion rate as used for validation.\n uint256 actualTokenCost = (actualGasCost + COST_OF_POST * gasPricePostOp) * maxTokenCost / maxCost;\n if (mode != PostOpMode.postOpReverted) {\n // attempt to pay with tokens:\n token.safeTransferFrom(account, address(this), actualTokenCost);\n } else {\n //in case above transferFrom failed, pay with deposit:\n balances[token][account] -= actualTokenCost;\n }\n balances[token][owner()] += actualTokenCost;\n }\n}\n"
+ },
+ "contracts/samples/gnosis/EIP4337Fallback.sol": {
+ "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable no-inline-assembly */\n\nimport \"@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\";\nimport \"@openzeppelin/contracts/interfaces/IERC1271.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"../../interfaces/IAccount.sol\";\nimport \"./EIP4337Manager.sol\";\n\nusing ECDSA for bytes32;\n\n/**\n * The GnosisSafe enables adding custom functions implementation to the Safe by setting a 'fallbackHandler'.\n * This 'fallbackHandler' adds an implementation of 'validateUserOp' to the GnosisSafe.\n * Note that the implementation of the 'validateUserOp' method is located in the EIP4337Manager.\n * Upon receiving the 'validateUserOp', a Safe with EIP4337Fallback enabled makes a 'delegatecall' to EIP4337Manager.\n */\ncontract EIP4337Fallback is DefaultCallbackHandler, IAccount, IERC1271 {\n bytes4 internal constant ERC1271_MAGIC_VALUE = 0x1626ba7e;\n\n address immutable public eip4337manager;\n constructor(address _eip4337manager) {\n eip4337manager = _eip4337manager;\n }\n\n /**\n * delegate the contract call to the EIP4337Manager\n */\n function delegateToManager() internal returns (bytes memory) {\n // delegate entire msg.data (including the appended \"msg.sender\") to the EIP4337Manager\n // will work only for GnosisSafe contracts\n GnosisSafe safe = GnosisSafe(payable(msg.sender));\n (bool success, bytes memory ret) = safe.execTransactionFromModuleReturnData(eip4337manager, 0, msg.data, Enum.Operation.DelegateCall);\n if (!success) {\n assembly {\n revert(add(ret, 32), mload(ret))\n }\n }\n return ret;\n }\n\n /**\n * called from the Safe. delegate actual work to EIP4337Manager\n */\n function validateUserOp(UserOperation calldata, bytes32, uint256) override external returns (uint256 deadline){\n bytes memory ret = delegateToManager();\n return abi.decode(ret, (uint256));\n }\n\n /**\n * Helper for wallet to get the next nonce.\n */\n function getNonce() public returns (uint256 nonce) {\n bytes memory ret = delegateToManager();\n (nonce) = abi.decode(ret, (uint256));\n }\n\n /**\n * called from the Safe. delegate actual work to EIP4337Manager\n */\n function executeAndRevert(\n address,\n uint256,\n bytes memory,\n Enum.Operation\n ) external {\n delegateToManager();\n }\n\n function isValidSignature(\n bytes32 _hash,\n bytes memory _signature\n ) external override view returns (bytes4) {\n bytes32 hash = _hash.toEthSignedMessageHash();\n address recovered = hash.recover(_signature);\n\n GnosisSafe safe = GnosisSafe(payable(address(msg.sender)));\n\n // Validate signatures\n if (safe.isOwner(recovered)) {\n return ERC1271_MAGIC_VALUE;\n } else {\n return 0xffffffff;\n }\n }\n}\n"
+ },
+ "contracts/samples/gnosis/EIP4337Manager.sol": {
+ "content": "//SPDX-License-Identifier: GPL\npragma solidity ^0.8.7;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/base/Executor.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/examples/libraries/GnosisSafeStorage.sol\";\nimport \"./EIP4337Fallback.sol\";\nimport \"../../interfaces/IAccount.sol\";\nimport \"../../interfaces/IEntryPoint.sol\";\nimport \"../../utils/Exec.sol\";\n\n using ECDSA for bytes32;\n\n/**\n * Main EIP4337 module.\n * Called (through the fallback module) using \"delegate\" from the GnosisSafe as an \"IAccount\",\n * so must implement validateUserOp\n * holds an immutable reference to the EntryPoint\n * Inherits GnosisSafe so that it can reference the memory storage\n */\ncontract EIP4337Manager is IAccount, GnosisSafeStorage, Executor {\n\n address public immutable eip4337Fallback;\n address public immutable entryPoint;\n\n // return value in case of signature failure, with no time-range.\n // equivalent to _packValidationData(true,0,0);\n uint256 constant internal SIG_VALIDATION_FAILED = 1;\n\n address internal constant SENTINEL_MODULES = address(0x1);\n\n constructor(address anEntryPoint) {\n entryPoint = anEntryPoint;\n eip4337Fallback = address(new EIP4337Fallback(address(this)));\n }\n\n /**\n * delegate-called (using execFromModule) through the fallback, so \"real\" msg.sender is attached as last 20 bytes\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external override returns (uint256 validationData) {\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\n require(msgSender == entryPoint, \"account: not from entrypoint\");\n\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\n bytes32 hash = userOpHash.toEthSignedMessageHash();\n address recovered = hash.recover(userOp.signature);\n require(threshold == 1, \"account: only threshold 1\");\n if (!pThis.isOwner(recovered)) {\n validationData = SIG_VALIDATION_FAILED;\n }\n\n // mimic normal Safe nonce behaviour: prevent parallel nonces\n require(userOp.nonce < type(uint64).max, \"account: nonsequential nonce\");\n\n if (missingAccountFunds > 0) {\n //Note: MAY pay more than the minimum, to deposit for future transactions\n (bool success,) = payable(msgSender).call{value : missingAccountFunds}(\"\");\n (success);\n //ignore failure (its EntryPoint's job to verify, not account.)\n }\n }\n\n /**\n * Execute a call but also revert if the execution fails.\n * The default behavior of the Safe is to not revert if the call fails,\n * which is challenging for integrating with ERC4337 because then the\n * EntryPoint wouldn't know to emit the UserOperationRevertReason event,\n * which the frontend/client uses to capture the reason for the failure.\n */\n function executeAndRevert(\n address to,\n uint256 value,\n bytes memory data,\n Enum.Operation operation\n ) external {\n address msgSender = address(bytes20(msg.data[msg.data.length - 20 :]));\n require(msgSender == entryPoint, \"account: not from entrypoint\");\n require(msg.sender == eip4337Fallback, \"account: not from EIP4337Fallback\");\n\n bool success = execute(\n to,\n value,\n data,\n operation,\n type(uint256).max\n );\n\n bytes memory returnData = Exec.getReturnData(type(uint256).max);\n // Revert with the actual reason string\n // Adopted from: https://github.com/Uniswap/v3-periphery/blob/464a8a49611272f7349c970e0fadb7ec1d3c1086/contracts/base/Multicall.sol#L16-L23\n if (!success) {\n if (returnData.length < 68) revert();\n assembly {\n returnData := add(returnData, 0x04)\n }\n revert(abi.decode(returnData, (string)));\n }\n }\n\n /**\n * Helper for wallet to get the next nonce.\n */\n function getNonce() public view returns (uint256) {\n return IEntryPoint(entryPoint).getNonce(address(this), 0);\n }\n\n /**\n * set up a safe as EIP-4337 enabled.\n * called from the GnosisSafeAccountFactory during construction time\n * - enable 3 modules (this module, fallback and the entrypoint)\n * - this method is called with delegateCall, so the module (usually itself) is passed as parameter, and \"this\" is the safe itself\n */\n function setup4337Modules(\n EIP4337Manager manager //the manager (this contract)\n ) external {\n GnosisSafe safe = GnosisSafe(payable(address(this)));\n require(!safe.isModuleEnabled(manager.entryPoint()), \"setup4337Modules: entrypoint already enabled\");\n require(!safe.isModuleEnabled(manager.eip4337Fallback()), \"setup4337Modules: eip4337Fallback already enabled\");\n safe.enableModule(manager.entryPoint());\n safe.enableModule(manager.eip4337Fallback());\n }\n\n /**\n * replace EIP4337 module, to support a new EntryPoint.\n * must be called using execTransaction and Enum.Operation.DelegateCall\n * @param prevModule returned by getCurrentEIP4337Manager\n * @param oldManager the old EIP4337 manager to remove, returned by getCurrentEIP4337Manager\n * @param newManager the new EIP4337Manager, usually with a new EntryPoint\n */\n function replaceEIP4337Manager(address prevModule, EIP4337Manager oldManager, EIP4337Manager newManager) public {\n GnosisSafe pThis = GnosisSafe(payable(address(this)));\n address oldFallback = oldManager.eip4337Fallback();\n require(pThis.isModuleEnabled(oldFallback), \"replaceEIP4337Manager: oldManager is not active\");\n pThis.disableModule(oldFallback, oldManager.entryPoint());\n pThis.disableModule(prevModule, oldFallback);\n\n address eip4337fallback = newManager.eip4337Fallback();\n\n pThis.enableModule(newManager.entryPoint());\n pThis.enableModule(eip4337fallback);\n pThis.setFallbackHandler(eip4337fallback);\n\n validateEip4337(pThis, newManager);\n }\n\n /**\n * Validate this gnosisSafe is callable through the EntryPoint.\n * the test is might be incomplete: we check that we reach our validateUserOp and fail on signature.\n * we don't test full transaction\n */\n function validateEip4337(GnosisSafe safe, EIP4337Manager manager) public {\n\n // this prevents mistaken replaceEIP4337Manager to disable the module completely.\n // minimal signature that pass \"recover\"\n bytes memory sig = new bytes(65);\n sig[64] = bytes1(uint8(27));\n sig[2] = bytes1(uint8(1));\n sig[35] = bytes1(uint8(1));\n uint256 nonce = uint256(IEntryPoint(manager.entryPoint()).getNonce(address(safe), 0));\n UserOperation memory userOp = UserOperation(address(safe), nonce, \"\", \"\", 0, 1000000, 0, 0, 0, \"\", sig);\n UserOperation[] memory userOps = new UserOperation[](1);\n userOps[0] = userOp;\n IEntryPoint _entryPoint = IEntryPoint(payable(manager.entryPoint()));\n try _entryPoint.handleOps(userOps, payable(msg.sender)) {\n revert(\"validateEip4337: handleOps must fail\");\n } catch (bytes memory error) {\n if (keccak256(error) != keccak256(abi.encodeWithSignature(\"FailedOp(uint256,string)\", 0, \"AA24 signature error\"))) {\n revert(string(error));\n }\n }\n }\n /**\n * enumerate modules, and find the currently active EIP4337 manager (and previous module)\n * @return prev prev module, needed by replaceEIP4337Manager\n * @return manager the current active EIP4337Manager\n */\n function getCurrentEIP4337Manager(GnosisSafe safe) public view returns (address prev, address manager) {\n prev = address(SENTINEL_MODULES);\n (address[] memory modules,) = safe.getModulesPaginated(SENTINEL_MODULES, 100);\n for (uint i = 0; i < modules.length; i++) {\n address module = modules[i];\n try EIP4337Fallback(module).eip4337manager() returns (address _manager) {\n return (prev, _manager);\n }\n // solhint-disable-next-line no-empty-blocks\n catch {}\n prev = module;\n }\n return (address(0), address(0));\n }\n}\n"
+ },
+ "contracts/samples/gnosis/GnosisAccountFactory.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol\";\nimport \"./EIP4337Manager.sol\";\n\n/**\n * A wrapper factory contract to deploy GnosisSafe as an ERC-4337 account contract.\n */\ncontract GnosisSafeAccountFactory {\n\n GnosisSafeProxyFactory public immutable proxyFactory;\n address public immutable safeSingleton;\n EIP4337Manager public immutable eip4337Manager;\n\n constructor(GnosisSafeProxyFactory _proxyFactory, address _safeSingleton, EIP4337Manager _eip4337Manager) {\n proxyFactory = _proxyFactory;\n safeSingleton = _safeSingleton;\n eip4337Manager = _eip4337Manager;\n }\n\n function createAccount(address owner,uint256 salt) public returns (address) {\n address addr = getAddress(owner, salt);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return addr;\n }\n return address(proxyFactory.createProxyWithNonce(\n safeSingleton, getInitializer(owner), salt));\n }\n\n function getInitializer(address owner) internal view returns (bytes memory) {\n address[] memory owners = new address[](1);\n owners[0] = owner;\n uint threshold = 1;\n address eip4337fallback = eip4337Manager.eip4337Fallback();\n\n bytes memory setup4337Modules = abi.encodeCall(\n EIP4337Manager.setup4337Modules, (eip4337Manager));\n\n return abi.encodeCall(GnosisSafe.setup, (\n owners, threshold,\n address (eip4337Manager), setup4337Modules,\n eip4337fallback,\n address(0), 0, payable(0) //no payment receiver\n ));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n * (uses the same \"create2 signature\" used by GnosisSafeProxyFactory.createProxyWithNonce)\n */\n function getAddress(address owner,uint256 salt) public view returns (address) {\n bytes memory initializer = getInitializer(owner);\n //copied from deployProxyWithNonce\n bytes32 salt2 = keccak256(abi.encodePacked(keccak256(initializer), salt));\n bytes memory deploymentData = abi.encodePacked(proxyFactory.proxyCreationCode(), uint256(uint160(safeSingleton)));\n return Create2.computeAddress(bytes32(salt2), keccak256(deploymentData), address (proxyFactory));\n }\n}\n"
+ },
+ "contracts/samples/IOracle.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface IOracle {\n\n /**\n * return amount of tokens that are required to receive that much eth.\n */\n function getTokenValueOfEth(uint256 ethOutput) external view returns (uint256 tokenInput);\n}\n\n"
+ },
+ "contracts/samples/SimpleAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"@openzeppelin/contracts/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\";\n\nimport \"../core/BaseAccount.sol\";\nimport \"./callback/TokenCallbackHandler.sol\";\n\n/**\n * minimal account.\n * this is sample minimal account.\n * has execute, eth handling methods\n * has a single signer that can send requests through the entryPoint.\n */\ncontract SimpleAccount is BaseAccount, TokenCallbackHandler, UUPSUpgradeable, Initializable {\n using ECDSA for bytes32;\n\n address public owner;\n\n IEntryPoint private immutable _entryPoint;\n\n event SimpleAccountInitialized(IEntryPoint indexed entryPoint, address indexed owner);\n\n modifier onlyOwner() {\n _onlyOwner();\n _;\n }\n\n /// @inheritdoc BaseAccount\n function entryPoint() public view virtual override returns (IEntryPoint) {\n return _entryPoint;\n }\n\n\n // solhint-disable-next-line no-empty-blocks\n receive() external payable {}\n\n constructor(IEntryPoint anEntryPoint) {\n _entryPoint = anEntryPoint;\n _disableInitializers();\n }\n\n function _onlyOwner() internal view {\n //directly from EOA owner, or through the account itself (which gets redirected through execute())\n require(msg.sender == owner || msg.sender == address(this), \"only owner\");\n }\n\n /**\n * execute a transaction (called directly from owner, or by entryPoint)\n */\n function execute(address dest, uint256 value, bytes calldata func) external {\n _requireFromEntryPointOrOwner();\n _call(dest, value, func);\n }\n\n /**\n * execute a sequence of transactions\n */\n function executeBatch(address[] calldata dest, bytes[] calldata func) external {\n _requireFromEntryPointOrOwner();\n require(dest.length == func.length, \"wrong array lengths\");\n for (uint256 i = 0; i < dest.length; i++) {\n _call(dest[i], 0, func[i]);\n }\n }\n\n /**\n * @dev The _entryPoint member is immutable, to reduce gas consumption. To upgrade EntryPoint,\n * a new implementation of SimpleAccount must be deployed with the new EntryPoint address, then upgrading\n * the implementation by calling `upgradeTo()`\n */\n function initialize(address anOwner) public virtual initializer {\n _initialize(anOwner);\n }\n\n function _initialize(address anOwner) internal virtual {\n owner = anOwner;\n emit SimpleAccountInitialized(_entryPoint, owner);\n }\n\n // Require the function call went through EntryPoint or owner\n function _requireFromEntryPointOrOwner() internal view {\n require(msg.sender == address(entryPoint()) || msg.sender == owner, \"account: not Owner or EntryPoint\");\n }\n\n /// implement template method of BaseAccount\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override virtual returns (uint256 validationData) {\n bytes32 hash = userOpHash.toEthSignedMessageHash();\n if (owner != hash.recover(userOp.signature))\n return SIG_VALIDATION_FAILED;\n return 0;\n }\n\n function _call(address target, uint256 value, bytes memory data) internal {\n (bool success, bytes memory result) = target.call{value : value}(data);\n if (!success) {\n assembly {\n revert(add(result, 32), mload(result))\n }\n }\n }\n\n /**\n * check current account deposit in the entryPoint\n */\n function getDeposit() public view returns (uint256) {\n return entryPoint().balanceOf(address(this));\n }\n\n /**\n * deposit more funds for this account in the entryPoint\n */\n function addDeposit() public payable {\n entryPoint().depositTo{value : msg.value}(address(this));\n }\n\n /**\n * withdraw value from the account's deposit\n * @param withdrawAddress target to send to\n * @param amount to withdraw\n */\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyOwner {\n entryPoint().withdrawTo(withdrawAddress, amount);\n }\n\n function _authorizeUpgrade(address newImplementation) internal view override {\n (newImplementation);\n _onlyOwner();\n }\n}\n\n"
+ },
+ "contracts/samples/SimpleAccountFactory.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\nimport \"./SimpleAccount.sol\";\n\n/**\n * A sample factory contract for SimpleAccount\n * A UserOperations \"initCode\" holds the address of the factory, and a method call (to createAccount, in this sample factory).\n * The factory's createAccount returns the target account address even if it is already installed.\n * This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.\n */\ncontract SimpleAccountFactory {\n SimpleAccount public immutable accountImplementation;\n\n constructor(IEntryPoint _entryPoint) {\n accountImplementation = new SimpleAccount(_entryPoint);\n }\n\n /**\n * create an account, and return its address.\n * returns the address even if the account is already deployed.\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n */\n function createAccount(address owner,uint256 salt) public returns (SimpleAccount ret) {\n address addr = getAddress(owner, salt);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return SimpleAccount(payable(addr));\n }\n ret = SimpleAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\n address(accountImplementation),\n abi.encodeCall(SimpleAccount.initialize, (owner))\n )));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n */\n function getAddress(address owner,uint256 salt) public view returns (address) {\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\n type(ERC1967Proxy).creationCode,\n abi.encode(\n address(accountImplementation),\n abi.encodeCall(SimpleAccount.initialize, (owner))\n )\n )));\n }\n}\n"
+ },
+ "contracts/samples/TokenPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"../core/BasePaymaster.sol\";\n\n/**\n * A sample paymaster that defines itself as a token to pay for gas.\n * The paymaster IS the token to use, since a paymaster cannot use an external contract.\n * Also, the exchange rate has to be fixed, since it can't reference an external Uniswap or other exchange contract.\n * subclass should override \"getTokenValueOfEth\" to provide actual token exchange rate, settable by the owner.\n * Known Limitation: this paymaster is exploitable when put into a batch with multiple ops (of different accounts):\n * - while a single op can't exploit the paymaster (if postOp fails to withdraw the tokens, the user's op is reverted,\n * and then we know we can withdraw the tokens), multiple ops with different senders (all using this paymaster)\n * in a batch can withdraw funds from 2nd and further ops, forcing the paymaster itself to pay (from its deposit)\n * - Possible workarounds are either use a more complex paymaster scheme (e.g. the DepositPaymaster) or\n * to whitelist the account and the called method ids.\n */\ncontract TokenPaymaster is BasePaymaster, ERC20 {\n\n //calculated cost of the postOp\n uint256 constant public COST_OF_POST = 15000;\n\n address public immutable theFactory;\n\n constructor(address accountFactory, string memory _symbol, IEntryPoint _entryPoint) ERC20(_symbol, _symbol) BasePaymaster(_entryPoint) {\n theFactory = accountFactory;\n //make it non-empty\n _mint(address(this), 1);\n\n //owner is allowed to withdraw tokens from the paymaster's balance\n _approve(address(this), msg.sender, type(uint).max);\n }\n\n\n /**\n * helpers for owner, to mint and withdraw tokens.\n * @param recipient - the address that will receive the minted tokens.\n * @param amount - the amount it will receive.\n */\n function mintTokens(address recipient, uint256 amount) external onlyOwner {\n _mint(recipient, amount);\n }\n\n /**\n * transfer paymaster ownership.\n * owner of this paymaster is allowed to withdraw funds (tokens transferred to this paymaster's balance)\n * when changing owner, the old owner's withdrawal rights are revoked.\n */\n function transferOwnership(address newOwner) public override virtual onlyOwner {\n // remove allowance of current owner\n _approve(address(this), owner(), 0);\n super.transferOwnership(newOwner);\n // new owner is allowed to withdraw tokens from the paymaster's balance\n _approve(address(this), newOwner, type(uint).max);\n }\n\n //Note: this method assumes a fixed ratio of token-to-eth. subclass should override to supply oracle\n // or a setter.\n function getTokenValueOfEth(uint256 valueEth) internal view virtual returns (uint256 valueToken) {\n return valueEth / 100;\n }\n\n /**\n * validate the request:\n * if this is a constructor call, make sure it is a known account.\n * verify the sender has enough tokens.\n * (since the paymaster is also the token, there is no notion of \"approval\")\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)\n internal view override returns (bytes memory context, uint256 validationData) {\n uint256 tokenPrefund = getTokenValueOfEth(requiredPreFund);\n\n // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough\n // make sure that verificationGasLimit is high enough to handle postOp\n require(userOp.verificationGasLimit > COST_OF_POST, \"TokenPaymaster: gas too low for postOp\");\n\n if (userOp.initCode.length != 0) {\n _validateConstructor(userOp);\n require(balanceOf(userOp.sender) >= tokenPrefund, \"TokenPaymaster: no balance (pre-create)\");\n } else {\n\n require(balanceOf(userOp.sender) >= tokenPrefund, \"TokenPaymaster: no balance\");\n }\n\n return (abi.encode(userOp.sender), 0);\n }\n\n // when constructing an account, validate constructor code and parameters\n // we trust our factory (and that it doesn't have any other public methods)\n function _validateConstructor(UserOperation calldata userOp) internal virtual view {\n address factory = address(bytes20(userOp.initCode[0 : 20]));\n require(factory == theFactory, \"TokenPaymaster: wrong account factory\");\n }\n\n /**\n * actual charge of user.\n * this method will be called just after the user's TX with mode==OpSucceeded|OpReverted (account pays in both cases)\n * BUT: if the user changed its balance in a way that will cause postOp to revert, then it gets called again, after reverting\n * the user's TX , back to the state it was before the transaction started (before the validatePaymasterUserOp),\n * and the transaction should succeed there.\n */\n function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override {\n //we don't really care about the mode, we just pay the gas with the user's tokens.\n (mode);\n address sender = abi.decode(context, (address));\n uint256 charge = getTokenValueOfEth(actualGasCost + COST_OF_POST);\n //actualGasCost is known to be no larger than the above requiredPreFund, so the transfer should succeed.\n _transfer(sender, address(this), charge);\n }\n}\n"
+ },
+ "contracts/samples/VerifyingPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n/* solhint-disable no-inline-assembly */\n\nimport \"../core/BasePaymaster.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n/**\n * A sample paymaster that uses external service to decide whether to pay for the UserOp.\n * The paymaster trusts an external signer to sign the transaction.\n * The calling user must pass the UserOp to that external signer first, which performs\n * whatever off-chain verification before signing the UserOp.\n * Note that this signature is NOT a replacement for the account-specific signature:\n * - the paymaster checks a signature to agree to PAY for GAS.\n * - the account checks a signature to prove identity and account ownership.\n */\ncontract VerifyingPaymaster is BasePaymaster {\n\n using ECDSA for bytes32;\n using UserOperationLib for UserOperation;\n\n address public immutable verifyingSigner;\n\n uint256 private constant VALID_TIMESTAMP_OFFSET = 20;\n\n uint256 private constant SIGNATURE_OFFSET = 84;\n\n constructor(IEntryPoint _entryPoint, address _verifyingSigner) BasePaymaster(_entryPoint) {\n verifyingSigner = _verifyingSigner;\n }\n\n mapping(address => uint256) public senderNonce;\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n // lighter signature scheme. must match UserOp.ts#packUserOp\n bytes calldata pnd = userOp.paymasterAndData;\n // copy directly the userOp from calldata up to (but not including) the paymasterAndData.\n // this encoding depends on the ABI encoding of calldata, but is much lighter to copy\n // than referencing each field separately.\n assembly {\n let ofs := userOp\n let len := sub(sub(pnd.offset, ofs), 32)\n ret := mload(0x40)\n mstore(0x40, add(ret, add(len, 32)))\n mstore(ret, len)\n calldatacopy(add(ret, 32), ofs, len)\n }\n }\n\n /**\n * return the hash we're going to sign off-chain (and validate on-chain)\n * this method is called by the off-chain service, to sign the request.\n * it is called on-chain from the validatePaymasterUserOp, to validate the signature.\n * note that this signature covers all fields of the UserOperation, except the \"paymasterAndData\",\n * which will carry the signature itself.\n */\n function getHash(UserOperation calldata userOp, uint48 validUntil, uint48 validAfter)\n public view returns (bytes32) {\n //can't use userOp.hash(), since it contains also the paymasterAndData itself.\n\n return keccak256(abi.encode(\n pack(userOp),\n block.chainid,\n address(this),\n senderNonce[userOp.getSender()],\n validUntil,\n validAfter\n ));\n }\n\n /**\n * verify our external signer signed this request.\n * the \"paymasterAndData\" is expected to be the paymaster and a signature over the entire request params\n * paymasterAndData[:20] : address(this)\n * paymasterAndData[20:84] : abi.encode(validUntil, validAfter)\n * paymasterAndData[84:] : signature\n */\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund)\n internal override returns (bytes memory context, uint256 validationData) {\n (requiredPreFund);\n\n (uint48 validUntil, uint48 validAfter, bytes calldata signature) = parsePaymasterAndData(userOp.paymasterAndData);\n //ECDSA library supports both 64 and 65-byte long signatures.\n // we only \"require\" it here so that the revert reason on invalid signature will be of \"VerifyingPaymaster\", and not \"ECDSA\"\n require(signature.length == 64 || signature.length == 65, \"VerifyingPaymaster: invalid signature length in paymasterAndData\");\n bytes32 hash = ECDSA.toEthSignedMessageHash(getHash(userOp, validUntil, validAfter));\n senderNonce[userOp.getSender()]++;\n\n //don't revert on signature failure: return SIG_VALIDATION_FAILED\n if (verifyingSigner != ECDSA.recover(hash, signature)) {\n return (\"\",_packValidationData(true,validUntil,validAfter));\n }\n\n //no need for other on-chain validation: entire UserOp should have been checked\n // by the external service prior to signing it.\n return (\"\",_packValidationData(false,validUntil,validAfter));\n }\n\n function parsePaymasterAndData(bytes calldata paymasterAndData) public pure returns(uint48 validUntil, uint48 validAfter, bytes calldata signature) {\n (validUntil, validAfter) = abi.decode(paymasterAndData[VALID_TIMESTAMP_OFFSET:SIGNATURE_OFFSET],(uint48, uint48));\n signature = paymasterAndData[SIGNATURE_OFFSET:];\n }\n}\n"
+ },
+ "contracts/test/BrokenBlsAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\nimport \"../samples/SimpleAccount.sol\";\nimport \"../samples/bls/IBLSAccount.sol\";\n\n/**\n * for testing: a BLS account that fails to return its public-key (completely ignores its publickey)\n * this is a copy of the normal bls account, but it returns a public-key unrelated to the one it is constructed with.\n */\ncontract BrokenBLSAccount is SimpleAccount, IBLSAccount {\n address public immutable aggregator;\n\n // The constructor is used only for the \"implementation\" and only sets immutable values.\n // Mutable values slots for proxy accounts are set by the 'initialize' function.\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\n aggregator = anAggregator;\n }\n\n function initialize(uint256[4] memory aPublicKey) public virtual initializer {\n (aPublicKey);\n super._initialize(address(0));\n }\n\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override view returns (uint256 validationData) {\n\n (userOp, userOpHash);\n return _packValidationData(ValidationData(aggregator, 0,0));\n }\n\n function getBlsPublicKey() external override pure returns (uint256[4] memory) {\n uint256[4] memory pubkey;\n return pubkey;\n }\n}\n\n\n/**\n * Based n SimpleAccountFactory\n * can't be a subclass, since both constructor and createAccount depend on the\n * actual wallet contract constructor and initializer\n */\ncontract BrokenBLSAccountFactory {\n BrokenBLSAccount public immutable accountImplementation;\n\n constructor(IEntryPoint entryPoint, address aggregator){\n accountImplementation = new BrokenBLSAccount(entryPoint, aggregator);\n }\n\n /**\n * create an account, and return its address.\n * returns the address even if the account is already deployed.\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n * Also note that out BLSSignatureAggregator requires that the public-key is the last parameter\n */\n function createAccount(uint salt, uint256[4] memory aPublicKey) public returns (BrokenBLSAccount) {\n\n address addr = getAddress(salt, aPublicKey);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return BrokenBLSAccount(payable(addr));\n }\n return BrokenBLSAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\n address(accountImplementation),\n abi.encodeCall(BrokenBLSAccount.initialize, aPublicKey)\n )));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n */\n function getAddress(uint salt, uint256[4] memory aPublicKey) public view returns (address) {\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\n type(ERC1967Proxy).creationCode,\n abi.encode(\n address(accountImplementation),\n abi.encodeCall(BrokenBLSAccount.initialize, (aPublicKey))\n )\n )));\n }\n}\n"
+ },
+ "contracts/test/MaliciousAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"../core/EntryPoint.sol\";\n\ncontract MaliciousAccount is IAccount {\n IEntryPoint private ep;\n constructor(IEntryPoint _ep) payable {\n ep = _ep;\n }\n function validateUserOp(UserOperation calldata userOp, bytes32, uint256 missingAccountFunds)\n external returns (uint256 validationData) {\n ep.depositTo{value : missingAccountFunds}(address(this));\n // Now calculate basefee per EntryPoint.getUserOpGasPrice() and compare it to the basefe we pass off-chain in the signature\n uint256 externalBaseFee = abi.decode(userOp.signature, (uint256));\n uint256 requiredGas = userOp.callGasLimit + userOp.verificationGasLimit + userOp.preVerificationGas;\n uint256 gasPrice = missingAccountFunds / requiredGas;\n uint256 basefee = gasPrice - userOp.maxPriorityFeePerGas;\n require (basefee == externalBaseFee, \"Revert after first validation\");\n return 0;\n }\n}\n"
+ },
+ "contracts/test/TestAggregatedAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../samples/SimpleAccount.sol\";\n\n/**\n * test aggregated-signature account.\n * works only with TestAggregatedSignature, which doesn't really check signature, but nonce sum\n * a true aggregated account should expose data (e.g. its public key) to the aggregator.\n */\ncontract TestAggregatedAccount is SimpleAccount {\n address public immutable aggregator;\n\n // The constructor is used only for the \"implementation\" and only sets immutable values.\n // Mutable value slots for proxy accounts are set by the 'initialize' function.\n constructor(IEntryPoint anEntryPoint, address anAggregator) SimpleAccount(anEntryPoint) {\n aggregator = anAggregator;\n }\n\n /// @inheritdoc SimpleAccount\n function initialize(address) public virtual override initializer {\n super._initialize(address(0));\n }\n\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override view returns (uint256 validationData) {\n (userOp, userOpHash);\n return _packValidationData(ValidationData(aggregator, 0, 0));\n }\n}\n"
+ },
+ "contracts/test/TestAggregatedAccountFactory.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Create2.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\nimport \"./TestAggregatedAccount.sol\";\n\n/**\n * Based on SimpleAccountFactory.\n * Cannot be a subclass since both constructor and createAccount depend on the\n * constructor and initializer of the actual account contract.\n */\ncontract TestAggregatedAccountFactory {\n TestAggregatedAccount public immutable accountImplementation;\n\n constructor(IEntryPoint anEntryPoint, address anAggregator){\n accountImplementation = new TestAggregatedAccount(anEntryPoint, anAggregator);\n }\n\n /**\n * create an account, and return its address.\n * returns the address even if the account is already deployed.\n * Note that during UserOperation execution, this method is called only if the account is not deployed.\n * This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation\n */\n function createAccount(address owner,uint256 salt) public returns (TestAggregatedAccount ret) {\n address addr = getAddress(owner, salt);\n uint codeSize = addr.code.length;\n if (codeSize > 0) {\n return TestAggregatedAccount(payable(addr));\n }\n ret = TestAggregatedAccount(payable(new ERC1967Proxy{salt : bytes32(salt)}(\n address(accountImplementation),\n abi.encodeCall(TestAggregatedAccount.initialize, (owner))\n )));\n }\n\n /**\n * calculate the counterfactual address of this account as it would be returned by createAccount()\n */\n function getAddress(address owner,uint256 salt) public view returns (address) {\n return Create2.computeAddress(bytes32(salt), keccak256(abi.encodePacked(\n type(ERC1967Proxy).creationCode,\n abi.encode(\n address(accountImplementation),\n abi.encodeCall(TestAggregatedAccount.initialize, (owner))\n )\n )));\n }\n}\n"
+ },
+ "contracts/test/TestCounter.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n//sample \"receiver\" contract, for testing \"exec\" from account.\ncontract TestCounter {\n mapping(address => uint256) public counters;\n\n function count() public {\n counters[msg.sender] = counters[msg.sender] + 1;\n }\n\n function countFail() public pure {\n revert(\"count failed\");\n }\n\n function justemit() public {\n emit CalledFrom(msg.sender);\n }\n\n event CalledFrom(address sender);\n\n //helper method to waste gas\n // repeat - waste gas on writing storage in a loop\n // junk - dynamic buffer to stress the function size.\n mapping(uint256 => uint256) public xxx;\n uint256 public offset;\n\n function gasWaster(uint256 repeat, string calldata /*junk*/) external {\n for (uint256 i = 1; i <= repeat; i++) {\n offset++;\n xxx[offset] = i;\n }\n }\n}\n"
+ },
+ "contracts/test/TestExpirePaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../core/BasePaymaster.sol\";\n\n/**\n * test expiry mechanism: paymasterData encodes the \"validUntil\" and validAfter\" times\n */\ncontract TestExpirePaymaster is BasePaymaster {\n // solhint-disable no-empty-blocks\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint)\n {}\n\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal virtual override view\n returns (bytes memory context, uint256 validationData) {\n (userOp, userOpHash, maxCost);\n (uint48 validAfter, uint48 validUntil) = abi.decode(userOp.paymasterAndData[20 :], (uint48, uint48));\n validationData = _packValidationData(false, validUntil, validAfter);\n context = \"\";\n }\n}\n"
+ },
+ "contracts/test/TestExpiryAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../samples/SimpleAccount.sol\";\n\n/**\n * A test account, for testing expiry.\n * add \"temporary\" owners, each with a time range (since..till) times for each.\n * NOTE: this is not a full \"session key\" implementation: a real session key should probably limit\n * other things, like target contracts and methods to be called.\n * also, the \"since\" value is not really useful, only for testing the entrypoint.\n */\ncontract TestExpiryAccount is SimpleAccount {\n using ECDSA for bytes32;\n\n mapping(address => uint48) public ownerAfter;\n mapping(address => uint48) public ownerUntil;\n\n // solhint-disable-next-line no-empty-blocks\n constructor(IEntryPoint anEntryPoint) SimpleAccount(anEntryPoint) {}\n\n function initialize(address anOwner) public virtual override initializer {\n super._initialize(anOwner);\n addTemporaryOwner(anOwner, 0, type(uint48).max);\n }\n\n // As this is a test contract, no need for proxy, so no need to disable init\n // solhint-disable-next-line no-empty-blocks\n function _disableInitializers() internal override {}\n\n function addTemporaryOwner(address owner, uint48 _after, uint48 _until) public onlyOwner {\n require(_until > _after, \"wrong until/after\");\n ownerAfter[owner] = _after;\n ownerUntil[owner] = _until;\n }\n\n /// implement template method of BaseAccount\n function _validateSignature(UserOperation calldata userOp, bytes32 userOpHash)\n internal override view returns (uint256 validationData) {\n bytes32 hash = userOpHash.toEthSignedMessageHash();\n address signer = hash.recover(userOp.signature);\n uint48 _until = ownerUntil[signer];\n uint48 _after = ownerAfter[signer];\n\n //we have \"until\" value for all valid owners. so zero means \"invalid signature\"\n bool sigFailed = _until == 0;\n return _packValidationData(sigFailed, _until, _after);\n }\n}\n"
+ },
+ "contracts/test/TestHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../core/Helpers.sol\";\n\ncontract TestHelpers {\n\n function parseValidationData(uint validationData) public pure returns (ValidationData memory) {\n return _parseValidationData(validationData);\n }\n\n function intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) public pure returns (ValidationData memory) {\n return _intersectTimeRange(validationData, paymasterValidationData);\n }\n\n function packValidationDataStruct(ValidationData memory data) public pure returns (uint256) {\n return _packValidationData(data);\n }\n\n function packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) public pure returns (uint256) {\n return _packValidationData(sigFailed, validUntil, validAfter);\n }\n}\n"
+ },
+ "contracts/test/TestOracle.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../samples/IOracle.sol\";\n\ncontract TestOracle is IOracle {\n function getTokenValueOfEth(uint256 ethOutput) external pure override returns (uint256 tokenInput) {\n return ethOutput * 2;\n }\n}\n"
+ },
+ "contracts/test/TestPaymasterAcceptAll.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../core/BasePaymaster.sol\";\n\n/**\n * test paymaster, that pays for everything, without any check.\n */\ncontract TestPaymasterAcceptAll is BasePaymaster {\n\n constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) {\n // to support \"deterministic address\" factory\n // solhint-disable avoid-tx-origin\n if (tx.origin != msg.sender) {\n _transferOwnership(tx.origin);\n }\n\n }\n\n function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n internal virtual override view\n returns (bytes memory context, uint256 validationData) {\n (userOp, userOpHash, maxCost);\n return (\"\", maxCost == 12345 ? 1 : 0);\n }\n}\n"
+ },
+ "contracts/test/TestRevertAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n/* solhint-disable no-inline-assembly */\n\nimport \"../samples/SimpleAccount.sol\";\ncontract TestRevertAccount is IAccount {\n IEntryPoint private ep;\n constructor(IEntryPoint _ep) payable {\n ep = _ep;\n }\n\n function validateUserOp(UserOperation calldata, bytes32, uint256 missingAccountFunds)\n external override returns (uint256 validationData) {\n ep.depositTo{value : missingAccountFunds}(address(this));\n return 0;\n }\n\n function revertLong(uint256 length) public pure{\n assembly {\n revert(0, length)\n }\n }\n}\n"
+ },
+ "contracts/test/TestSignatureAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable reason-string */\n\nimport \"../interfaces/IAggregator.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"../samples/SimpleAccount.sol\";\n\n/**\n * test signature aggregator.\n * the aggregated signature is the SUM of the nonce fields..\n */\ncontract TestSignatureAggregator is IAggregator {\n\n /// @inheritdoc IAggregator\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external pure override {\n uint sum = 0;\n for (uint i = 0; i < userOps.length; i++) {\n uint nonce = userOps[i].nonce;\n sum += nonce;\n }\n require(signature.length == 32, \"TestSignatureValidator: sig must be uint\");\n (uint sig) = abi.decode(signature, (uint));\n require(sig == sum, \"TestSignatureValidator: aggregated signature mismatch (nonce sum)\");\n }\n\n /// @inheritdoc IAggregator\n function validateUserOpSignature(UserOperation calldata)\n external pure returns (bytes memory) {\n return \"\";\n }\n\n /**\n * dummy test aggregator: sum all nonce values of UserOps.\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external pure returns (bytes memory aggregatedSignature) {\n uint sum = 0;\n for (uint i = 0; i < userOps.length; i++) {\n sum += userOps[i].nonce;\n }\n return abi.encode(sum);\n }\n\n /**\n * Calls the 'addStake' method of the EntryPoint. Forwards the entire msg.value to this call.\n * @param entryPoint - the EntryPoint to send the stake to.\n * @param delay - the new lock duration before the deposit can be withdrawn.\n */\n function addStake(IEntryPoint entryPoint, uint32 delay) external payable {\n entryPoint.addStake{value: msg.value}(delay);\n }\n}\n"
+ },
+ "contracts/test/TestToken.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract TestToken is ERC20 {\n constructor ()\n // solhint-disable-next-line no-empty-blocks\n ERC20(\"TST\", \"TestToken\") {\n }\n\n function mint(address sender, uint256 amount) external {\n _mint(sender, amount);\n }\n}\n"
+ },
+ "contracts/test/TestUtil.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/UserOperation.sol\";\n\ncontract TestUtil {\n using UserOperationLib for UserOperation;\n\n function packUserOp(UserOperation calldata op) external pure returns (bytes memory){\n return op.pack();\n }\n\n}\n"
+ },
+ "contracts/test/TestWarmColdAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IEntryPoint.sol\";\nimport \"../interfaces/IAccount.sol\";\n\n// Using eip-2929 (https://eips.ethereum.org/EIPS/eip-2929) warm/cold storage access gas costs to detect simulation vs execution\n// COLD_ACCOUNT_ACCESS_COST == 2600, COLD_SLOAD_COST == 2100, WARM_STORAGE_READ_COST == 100\ncontract TestWarmColdAccount is IAccount {\n IEntryPoint private ep;\n uint public state = 1;\n constructor(IEntryPoint _ep) payable {\n ep = _ep;\n }\n\n function validateUserOp(UserOperation calldata userOp, bytes32, uint256 missingAccountFunds)\n external override returns (uint256 validationData) {\n ep.depositTo{value : missingAccountFunds}(address(this));\n if (userOp.nonce == 1) {\n // can only succeed if storage is already warm\n this.touchStorage{gas: 1000}();\n } else if (userOp.nonce == 2) {\n address paymaster = address(bytes20(userOp.paymasterAndData[: 20]));\n // can only succeed if storage is already warm\n this.touchPaymaster{gas: 1000}(paymaster);\n }\n return 0;\n }\n\n function touchStorage() public view returns (uint256) {\n return state;\n }\n\n function touchPaymaster(address paymaster) public view returns (uint256) {\n return paymaster.code.length;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata",
+ "devdoc",
+ "userdoc",
+ "storageLayout",
+ "evm.gasEstimates"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ },
+ "metadata": {
+ "useLiteralContent": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/a4c52f0671aad8941c53d6ead2063803.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
new file mode 100644
index 000000000..dd58ba5a3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
@@ -0,0 +1,68 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/cfbebdf1101dd2bc0f310cb0b7d62cb7.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/cfbebdf1101dd2bc0f310cb0b7d62cb7.json
new file mode 100644
index 000000000..dd27f82ce
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/cfbebdf1101dd2bc0f310cb0b7d62cb7.json
@@ -0,0 +1,59 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n revert SenderAddressResult(senderCreator.createSender(initCode));\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\n\ninterface IEntryPoint is IStakeManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n /**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n //lighter signature scheme. must match UserOp.ts#packUserOp\n bytes calldata sig = userOp.signature;\n // copy directly the userOp from calldata up to (but not including) the signature.\n // this encoding depends on the ABI encoding of calldata, but is much lighter to copy\n // than referencing each field separately.\n assembly {\n let ofs := userOp\n let len := sub(sub(sig.offset, ofs), 32)\n ret := mload(0x40)\n mstore(0x40, add(ret, add(len, 32)))\n mstore(ret, len)\n calldatacopy(add(ret, 32), ofs, len)\n }\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/.chainId
new file mode 100644
index 000000000..065fd3e79
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/.chainId
@@ -0,0 +1 @@
+137
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/EntryPoint.json
new file mode 100644
index 000000000..037750fba
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/EntryPoint.json
@@ -0,0 +1,1318 @@
+{
+ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "paid",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bool",
+ "name": "targetSuccess",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetResult",
+ "type": "bytes"
+ }
+ ],
+ "name": "ExecutionResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SenderAddressResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureValidationFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct IEntryPoint.AggregatorStakeInfo",
+ "name": "aggregatorInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResultWithAggregation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "factory",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "AccountDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "BeforeExecution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalDeposit",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposited",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureAggregatorChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStaked",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeLocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasUsed",
+ "type": "uint256"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawn",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "SIG_VALIDATION_FAILED",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ }
+ ],
+ "name": "_validateSenderAndPaymaster",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "depositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "deposits",
+ "outputs": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getDepositInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "internalType": "struct IStakeManager.DepositInfo",
+ "name": "info",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "getUserOpHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "userOps",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "contract IAggregator",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.UserOpsPerAggregator[]",
+ "name": "opsPerAggregator",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleAggregatedOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "incrementNonce",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.MemoryUserOp",
+ "name": "mUserOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "contextOffset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.UserOpInfo",
+ "name": "opInfo",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ }
+ ],
+ "name": "innerHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonceSequenceNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetCallData",
+ "type": "bytes"
+ }
+ ],
+ "name": "simulateHandleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateValidation",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "withdrawAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [],
+ "numDeployments": 2,
+ "solcInputHash": "a4c52f0671aad8941c53d6ead2063803",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://69643e83f68e6a13d5075c7565bfce326673b0bd98c432033c4603ea84835746\",\"dweb:/ipfs/QmSwSzjYyV7qudi5vvsmzHMG2Z4YJZxX51RRXXVCLaNcEU\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ff83c59432e733bf6304dda27cd4b0f34401917dd535e2669cc842d2d26568c\",\"dweb:/ipfs/QmPJbHU5TAjHqUTZzAcicEeG2nknmwCN43L4EW9LHbknTN\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}",
+ "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
+ "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/solcInputs/a4c52f0671aad8941c53d6ead2063803.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
new file mode 100644
index 000000000..dd58ba5a3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
@@ -0,0 +1,68 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/solcInputs/cfbebdf1101dd2bc0f310cb0b7d62cb7.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/solcInputs/cfbebdf1101dd2bc0f310cb0b7d62cb7.json
new file mode 100644
index 000000000..dd27f82ce
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/solcInputs/cfbebdf1101dd2bc0f310cb0b7d62cb7.json
@@ -0,0 +1,59 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n revert SenderAddressResult(senderCreator.createSender(initCode));\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\n\ninterface IEntryPoint is IStakeManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n /**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n //lighter signature scheme. must match UserOp.ts#packUserOp\n bytes calldata sig = userOp.signature;\n // copy directly the userOp from calldata up to (but not including) the signature.\n // this encoding depends on the ABI encoding of calldata, but is much lighter to copy\n // than referencing each field separately.\n assembly {\n let ofs := userOp\n let len := sub(sub(sig.offset, ofs), 32)\n ret := mload(0x40)\n mstore(0x40, add(ret, add(len, 32)))\n mstore(ret, len)\n calldatacopy(add(ret, 32), ofs, len)\n }\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/.chainId
new file mode 100644
index 000000000..d7e2f72ce
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/.chainId
@@ -0,0 +1 @@
+80001
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/EntryPoint.json
new file mode 100644
index 000000000..916c23908
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/EntryPoint.json
@@ -0,0 +1,1318 @@
+{
+ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "paid",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bool",
+ "name": "targetSuccess",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetResult",
+ "type": "bytes"
+ }
+ ],
+ "name": "ExecutionResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SenderAddressResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureValidationFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct IEntryPoint.AggregatorStakeInfo",
+ "name": "aggregatorInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResultWithAggregation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "factory",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "AccountDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "BeforeExecution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalDeposit",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposited",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureAggregatorChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStaked",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeLocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasUsed",
+ "type": "uint256"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawn",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "SIG_VALIDATION_FAILED",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ }
+ ],
+ "name": "_validateSenderAndPaymaster",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "depositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "deposits",
+ "outputs": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getDepositInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "internalType": "struct IStakeManager.DepositInfo",
+ "name": "info",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "getUserOpHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "userOps",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "contract IAggregator",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.UserOpsPerAggregator[]",
+ "name": "opsPerAggregator",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleAggregatedOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "incrementNonce",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.MemoryUserOp",
+ "name": "mUserOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "contextOffset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.UserOpInfo",
+ "name": "opInfo",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ }
+ ],
+ "name": "innerHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonceSequenceNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetCallData",
+ "type": "bytes"
+ }
+ ],
+ "name": "simulateHandleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateValidation",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "withdrawAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [],
+ "numDeployments": 1,
+ "solcInputHash": "a4c52f0671aad8941c53d6ead2063803",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://69643e83f68e6a13d5075c7565bfce326673b0bd98c432033c4603ea84835746\",\"dweb:/ipfs/QmSwSzjYyV7qudi5vvsmzHMG2Z4YJZxX51RRXXVCLaNcEU\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ff83c59432e733bf6304dda27cd4b0f34401917dd535e2669cc842d2d26568c\",\"dweb:/ipfs/QmPJbHU5TAjHqUTZzAcicEeG2nknmwCN43L4EW9LHbknTN\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}",
+ "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
+ "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/solcInputs/a4c52f0671aad8941c53d6ead2063803.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
new file mode 100644
index 000000000..dd58ba5a3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
@@ -0,0 +1,68 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/.chainId
new file mode 100644
index 000000000..9a037142a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/.chainId
@@ -0,0 +1 @@
+10
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/EntryPoint.json
new file mode 100644
index 000000000..916c23908
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/EntryPoint.json
@@ -0,0 +1,1318 @@
+{
+ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "paid",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bool",
+ "name": "targetSuccess",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetResult",
+ "type": "bytes"
+ }
+ ],
+ "name": "ExecutionResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SenderAddressResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureValidationFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct IEntryPoint.AggregatorStakeInfo",
+ "name": "aggregatorInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResultWithAggregation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "factory",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "AccountDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "BeforeExecution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalDeposit",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposited",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureAggregatorChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStaked",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeLocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasUsed",
+ "type": "uint256"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawn",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "SIG_VALIDATION_FAILED",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ }
+ ],
+ "name": "_validateSenderAndPaymaster",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "depositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "deposits",
+ "outputs": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getDepositInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "internalType": "struct IStakeManager.DepositInfo",
+ "name": "info",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "getUserOpHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "userOps",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "contract IAggregator",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.UserOpsPerAggregator[]",
+ "name": "opsPerAggregator",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleAggregatedOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "incrementNonce",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.MemoryUserOp",
+ "name": "mUserOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "contextOffset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.UserOpInfo",
+ "name": "opInfo",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ }
+ ],
+ "name": "innerHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonceSequenceNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetCallData",
+ "type": "bytes"
+ }
+ ],
+ "name": "simulateHandleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateValidation",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "withdrawAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [],
+ "numDeployments": 1,
+ "solcInputHash": "a4c52f0671aad8941c53d6ead2063803",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://69643e83f68e6a13d5075c7565bfce326673b0bd98c432033c4603ea84835746\",\"dweb:/ipfs/QmSwSzjYyV7qudi5vvsmzHMG2Z4YJZxX51RRXXVCLaNcEU\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ff83c59432e733bf6304dda27cd4b0f34401917dd535e2669cc842d2d26568c\",\"dweb:/ipfs/QmPJbHU5TAjHqUTZzAcicEeG2nknmwCN43L4EW9LHbknTN\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}",
+ "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
+ "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/solcInputs/a4c52f0671aad8941c53d6ead2063803.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
new file mode 100644
index 000000000..dd58ba5a3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
@@ -0,0 +1,68 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/.chainId b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/.chainId
new file mode 100644
index 000000000..bd8d1cd44
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/.chainId
@@ -0,0 +1 @@
+11155111
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/EntryPoint.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/EntryPoint.json
new file mode 100644
index 000000000..916c23908
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/EntryPoint.json
@@ -0,0 +1,1318 @@
+{
+ "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "paid",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bool",
+ "name": "targetSuccess",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetResult",
+ "type": "bytes"
+ }
+ ],
+ "name": "ExecutionResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "opIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "reason",
+ "type": "string"
+ }
+ ],
+ "name": "FailedOp",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SenderAddressResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureValidationFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "sigFailed",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validAfter",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "validUntil",
+ "type": "uint48"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterContext",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.ReturnInfo",
+ "name": "returnInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "senderInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "factoryInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "paymasterInfo",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "stake",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct IStakeManager.StakeInfo",
+ "name": "stakeInfo",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct IEntryPoint.AggregatorStakeInfo",
+ "name": "aggregatorInfo",
+ "type": "tuple"
+ }
+ ],
+ "name": "ValidationResultWithAggregation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "factory",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ }
+ ],
+ "name": "AccountDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "BeforeExecution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalDeposit",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposited",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "aggregator",
+ "type": "address"
+ }
+ ],
+ "name": "SignatureAggregatorChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalStaked",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "unstakeDelaySec",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeLocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "withdrawTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeUnlocked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "StakeWithdrawn",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "actualGasUsed",
+ "type": "uint256"
+ }
+ ],
+ "name": "UserOperationEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "revertReason",
+ "type": "bytes"
+ }
+ ],
+ "name": "UserOperationRevertReason",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawn",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "SIG_VALIDATION_FAILED",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ }
+ ],
+ "name": "_validateSenderAndPaymaster",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ }
+ ],
+ "name": "addStake",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "depositTo",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "deposits",
+ "outputs": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "getDepositInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint112",
+ "name": "deposit",
+ "type": "uint112"
+ },
+ {
+ "internalType": "bool",
+ "name": "staked",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint112",
+ "name": "stake",
+ "type": "uint112"
+ },
+ {
+ "internalType": "uint32",
+ "name": "unstakeDelaySec",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint48",
+ "name": "withdrawTime",
+ "type": "uint48"
+ }
+ ],
+ "internalType": "struct IStakeManager.DepositInfo",
+ "name": "info",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "getNonce",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "getSenderAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "getUserOpHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "userOps",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "contract IAggregator",
+ "name": "aggregator",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct IEntryPoint.UserOpsPerAggregator[]",
+ "name": "opsPerAggregator",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleAggregatedOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation[]",
+ "name": "ops",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address payable",
+ "name": "beneficiary",
+ "type": "address"
+ }
+ ],
+ "name": "handleOps",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint192",
+ "name": "key",
+ "type": "uint192"
+ }
+ ],
+ "name": "incrementNonce",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "paymaster",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.MemoryUserOp",
+ "name": "mUserOp",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "userOpHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "prefund",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "contextOffset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preOpGas",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct EntryPoint.UserOpInfo",
+ "name": "opInfo",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "context",
+ "type": "bytes"
+ }
+ ],
+ "name": "innerHandleOp",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "actualGasCost",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint192",
+ "name": "",
+ "type": "uint192"
+ }
+ ],
+ "name": "nonceSequenceNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "op",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "targetCallData",
+ "type": "bytes"
+ }
+ ],
+ "name": "simulateHandleOp",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "callData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "callGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "verificationGasLimit",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "preVerificationGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxPriorityFeePerGas",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "paymasterAndData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct UserOperation",
+ "name": "userOp",
+ "type": "tuple"
+ }
+ ],
+ "name": "simulateValidation",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unlockStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ }
+ ],
+ "name": "withdrawStake",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address payable",
+ "name": "withdrawAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "withdrawAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawTo",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "args": [],
+ "numDeployments": 1,
+ "solcInputHash": "a4c52f0671aad8941c53d6ead2063803",
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"struct IStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct IEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"BeforeExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"struct IStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint192\",\"name\":\"key\",\"type\":\"uint192\"}],\"name\":\"incrementNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"struct EntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"name\":\"nonceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct UserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedOp(uint256,string)\":[{\"params\":{\"opIndex\":\"- index into the array of ops to the failed one (in simulateValidation, this is always zero)\",\"reason\":\"- revert reason The string starts with a unique code \\\"AAmn\\\", where \\\"m\\\" is \\\"1\\\" for factory, \\\"2\\\" for account and \\\"3\\\" for paymaster issues, so a failure can be attributed to the correct entity. Should be caught in off-chain handleOps simulation and not happen on-chain. Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\"}}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"params\":{\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"params\":{\"aggregatorInfo\":\"signature aggregation info (if the account requires signature aggregator) bundler MUST use it to verify the signature, or reject the UserOperation\",\"factoryInfo\":\"stake information about the factory (if any)\",\"paymasterInfo\":\"stake information about the paymaster (if any)\",\"returnInfo\":\"gas and time-range returned values\",\"senderInfo\":\"stake information about the sender\"}}]},\"kind\":\"dev\",\"methods\":{\"addStake(uint32)\":{\"params\":{\"unstakeDelaySec\":\"the new lock duration before the deposit can be withdrawn.\"}},\"getDepositInfo(address)\":{\"returns\":{\"info\":\"- full deposit information of given account\"}},\"getNonce(address,uint192)\":{\"params\":{\"key\":\"the high 192 bit of the nonce\",\"sender\":\"the account address\"},\"returns\":{\"nonce\":\"a full nonce to pass for next UserOp with this sender.\"}},\"getSenderAddress(bytes)\":{\"params\":{\"initCode\":\"the constructor code to be passed into the UserOperation.\"}},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"opsPerAggregator\":\"the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\"}},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"params\":{\"beneficiary\":\"the address to receive the fees\",\"ops\":\"the operations to execute\"}},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"params\":{\"op\":\"the UserOperation to simulate\",\"target\":\"if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult are set to the return from that call.\",\"targetCallData\":\"callData to pass to target address\"}},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"details\":\"this method always revert. Successful result is ValidationResult error. other errors are failures.The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\",\"params\":{\"userOp\":\"the user operation to validate.\"}},\"withdrawStake(address)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\"}},\"withdrawTo(address,uint256)\":{\"params\":{\"withdrawAddress\":\"the address to send withdrawn value.\",\"withdrawAmount\":\"the amount to withdraw.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ExecutionResult(uint256,uint256,uint48,uint48,bool,bytes)\":[{\"notice\":\"return value of simulateHandleOp\"}],\"FailedOp(uint256,string)\":[{\"notice\":\"a custom revert error of handleOps, to identify the offending op. NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\"}],\"SenderAddressResult(address)\":[{\"notice\":\"return value of getSenderAddress\"}],\"SignatureValidationFailed(address)\":[{\"notice\":\"error case when a signature aggregator fails to verify the aggregated signature it had created.\"}],\"ValidationResult((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256))\":[{\"notice\":\"Successful result from simulateValidation.\"}],\"ValidationResultWithAggregation((uint256,uint256,bool,uint48,uint48,bytes),(uint256,uint256),(uint256,uint256),(uint256,uint256),(address,(uint256,uint256)))\":[{\"notice\":\"Successful result from simulateValidation, if the account returns a signature aggregator\"}]},\"events\":{\"AccountDeployed(bytes32,address,address,address)\":{\"notice\":\"account \\\"sender\\\" was deployed.\"},\"BeforeExecution()\":{\"notice\":\"an event emitted by handleOps(), before starting the execution loop. any event emitted before this event, is part of the validation.\"},\"SignatureAggregatorChanged(address)\":{\"notice\":\"signature aggregator used by the following UserOperationEvents within this bundle.\"},\"StakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when stake or unstake delay are modified\"},\"StakeUnlocked(address,uint256)\":{\"notice\":\"Emitted once a stake is scheduled for withdrawal\"},\"UserOperationRevertReason(bytes32,address,uint256,bytes)\":{\"notice\":\"An event emitted if the UserOperation \\\"callData\\\" reverted with non-zero length\"}},\"kind\":\"user\",\"methods\":{\"SIG_VALIDATION_FAILED()\":{\"notice\":\"for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.\"},\"_validateSenderAndPaymaster(bytes,address,bytes)\":{\"notice\":\"Called only during simulation. This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\"},\"addStake(uint32)\":{\"notice\":\"add to the account's stake - amount and delay any pending unstake is first cancelled.\"},\"balanceOf(address)\":{\"notice\":\"return the deposit (for gas payment) of the account\"},\"depositTo(address)\":{\"notice\":\"add to the deposit of the given account\"},\"deposits(address)\":{\"notice\":\"maps paymaster to their deposits and stakes\"},\"getNonce(address,uint192)\":{\"notice\":\"Return the next nonce for this sender. Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop) But UserOp with different keys can come with arbitrary order.\"},\"getSenderAddress(bytes)\":{\"notice\":\"Get counterfactual sender address. Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. this method always revert, and returns the address in SenderAddressResult error\"},\"getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"generate a request Id - unique identifier for this request. the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\"},\"handleAggregatedOps(((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperation with Aggregators\"},\"handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],address)\":{\"notice\":\"Execute a batch of UserOperations. no signature aggregator is used. if any account requires an aggregator (that is, it returned an aggregator when performing simulateValidation), then handleAggregatedOps() must be used instead.\"},\"incrementNonce(uint192)\":{\"notice\":\"Manually increment the nonce of the sender. This method is exposed just for completeness.. Account does NOT need to call it, neither during validation, nor elsewhere, as the EntryPoint will update the nonce regardless. Possible use-case is call it with various keys to \\\"initialize\\\" their nonces to one, so that future UserOperations will not pay extra for the first transaction with a given key.\"},\"innerHandleOp(bytes,((address,uint256,uint256,uint256,uint256,address,uint256,uint256),bytes32,uint256,uint256,uint256),bytes)\":{\"notice\":\"inner function to handle a UserOperation. Must be declared \\\"external\\\" to open a call context, but it can only be called by handleOps.\"},\"nonceSequenceNumber(address,uint192)\":{\"notice\":\"The next valid sequence number for a given nonce key.\"},\"simulateHandleOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),address,bytes)\":{\"notice\":\"simulate full execution of a UserOperation (including both validation and target execution) this method will always revert with \\\"ExecutionResult\\\". it performs full validation of the UserOperation, but ignores signature error. an optional target address is called after the userop succeeds, and its value is returned (before the entire call is reverted) Note that in order to collect the the success/failure of the target call, it must be executed with trace enabled to track the emitted events.\"},\"simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\":{\"notice\":\"Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\"},\"unlockStake()\":{\"notice\":\"attempt to unlock the stake. the value can be withdrawn (using withdrawStake) after the unstake delay.\"},\"withdrawStake(address)\":{\"notice\":\"withdraw from the (unlocked) stake. must first call unlockStake and wait for the unstakeDelay to pass\"},\"withdrawTo(address,uint256)\":{\"notice\":\"withdraw from the deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/EntryPoint.sol\":\"EntryPoint\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x190dd6f8d592b7e4e930feb7f4313aeb8e1c4ad3154c27ce1cf6a512fc30d8cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ce8dfb62d0c4fa260d6eec8f1cd47f5f2a044e11bde5b31d18072fa6e7d9010\",\"dweb:/ipfs/QmTyFztU3tLEcEDnqqiaW4UJetqsU77LXc6pjc9oTXCK5u\"]},\"contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x04f86318b47f052d7308795ffae6ecec0d023d2458b4e17751b89a0e4acfcdc6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c9f6e359c8dbe875ad974d3a0fb7b3d62319a6b115c44bac1e4587ae2ad2edaf\",\"dweb:/ipfs/QmTSWTov2rUeYk8cwzrtsd3uVXokCYok4gMiZ1sPs9tycH\"]},\"contracts/core/Helpers.sol\":{\"keccak256\":\"0x591c87519f7155d1909210276b77925ab2722a99b7b5d5649aecc36ebbdb045a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://69643e83f68e6a13d5075c7565bfce326673b0bd98c432033c4603ea84835746\",\"dweb:/ipfs/QmSwSzjYyV7qudi5vvsmzHMG2Z4YJZxX51RRXXVCLaNcEU\"]},\"contracts/core/NonceManager.sol\":{\"keccak256\":\"0xa17a4a6fde70088ab18ffe6df830f3efa31f1cd0e1a7160336c96e3c94984d25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b38615df9f80c56282b72888e9ba1eb1a9413fa67a0dbf094deda7af9feb38e7\",\"dweb:/ipfs/QmSzcXetEJRH4UHuUmZiSgX6bFgfqHWfmyuxVnh4NosMk1\"]},\"contracts/core/SenderCreator.sol\":{\"keccak256\":\"0x44b9449fec82d6cdfb01d52fdd5a72f90099c651316123810cf9633f00b018c2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a9c0487390e72638681d175c45bc92425c802fffdca4bd0ae8457782ee284612\",\"dweb:/ipfs/QmVbzuehCUWJWqEHyMWuc6cRVbxfcMdFsmGL9o4Wz7WY2x\"]},\"contracts/core/StakeManager.sol\":{\"keccak256\":\"0x21aa0956382bd000b1b8c3b1d19ca6ebcd6c9029eebb19c612fb38ee5dd2430a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://0a625c8795354d9f429367f9c1d14eb8af7db9c7f2c2a2033e2066ced76a573a\",\"dweb:/ipfs/Qmd1j6UarUg54q1G2HCNCLQz8XGVZR1qxX7eQ6cytHpQPN\"]},\"contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x556a0e5980de18e90b115553ed502408155ba35f58642823010d9288047bc418\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0f420134b79596db8737173c7b933ae0a33059e107b6327c43aa40d4744a9e4\",\"dweb:/ipfs/QmRo8s1AhXmEMV7uPYnbpYwU19e9Bk6jmYBJTiPx3Fo85W\"]},\"contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0x060e9ddb0152250c269ba0640dc5753834ac44cf182a2837d508c0c529cae26a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://20ed837bc5909c89ff1910246bf245a5dad6840aa939382e1694964eb7dbd37b\",\"dweb:/ipfs/QmTMybRq5yyghPDDs1ZCNAVB9sSJ4WHe6Q9mejuKPTAdNP\"]},\"contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x3a90bf308819ed125fa4202f880999caff8a8686633b8ddb79a30ca240d5b8f8\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2d21cc92c2fdab2b58d21bc25d4cd0e8c284b922528a186b087b818d54bc6cf\",\"dweb:/ipfs/QmT1qrfuBjsv2rmRCDn8mgPXHp94hARJwzbcDuBLDTbFWd\"]},\"contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x36858ba8685024974f533530420688da3454d29996ebc42e410673a1ed2ec456\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://616cbcf51778b1961b7f20a547bec7efae6d1d565df0f651926241ed8bde9ad8\",\"dweb:/ipfs/QmaVsgffUUmeUJYgStvRr8cNZ1LBbrc3FYNLW4JT1dVLia\"]},\"contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xd227b02888cd4ac68daebcdfd992ec00f9fff66fa3b3bb16f656cd582fa3480f\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b389da4714a138be63704a576a482505eab2855e263b38a93706395d8d42e7c3\",\"dweb:/ipfs/QmeeAZpdHwUXxqP8pxA7GNtoCGBmmH4FaqLLwScVKGxtxZ\"]},\"contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x61374003361059087fdcf17967a7bba052badeaf5c7f0ae689166f8aafd3a45c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ff83c59432e733bf6304dda27cd4b0f34401917dd535e2669cc842d2d26568c\",\"dweb:/ipfs/QmPJbHU5TAjHqUTZzAcicEeG2nknmwCN43L4EW9LHbknTN\"]},\"contracts/utils/Exec.sol\":{\"keccak256\":\"0x5b232117afbc2939f3ffc92745614867e9e1d475a3e1e5443adae13c200174f1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://62e7365379a06ead7b47637945bcaee095d51aab1d3ac00ddec69443e6cbe9fe\",\"dweb:/ipfs/QmctG3aw4U3KMSMeJKoLJ1NJewjMWfppnd1m3kxNTe39Uy\"]}},\"version\":1}",
+ "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
+ "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/solcInputs/a4c52f0671aad8941c53d6ead2063803.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
new file mode 100644
index 000000000..dd58ba5a3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/solcInputs/a4c52f0671aad8941c53d6ead2063803.json
@@ -0,0 +1,68 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "@openzeppelin/contracts/security/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n"
+ },
+ "contracts/core/EntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\n\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard {\n\n using UserOperationLib for UserOperation;\n\n SenderCreator private immutable senderCreator = new SenderCreator();\n\n // internal value used during simulation: need to query aggregator.\n address private constant SIMULATE_FIND_AGGREGATOR = address(1);\n\n // marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex'deaddead';\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n\n /**\n * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value\n * in case of signature failure, instead of revert.\n */\n uint256 public constant SIG_VALIDATION_FAILED = 1;\n\n /**\n * compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary the address to receive the fees\n * @param amount amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value : amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * execute a user op\n * @param opIndex index into the opInfo array\n * @param userOp the userOp to execute\n * @param opInfo the opInfo filled by validatePrepayment for this userOp.\n * @return collected the total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory opInfo) private returns (uint256 collected) {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n\n try this.innerHandleOp(userOp.callData, opInfo, context) returns (uint256 _actualGasCost) {\n collected = _actualGasCost;\n } catch {\n bytes32 innerRevertCode;\n assembly {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n // handleOps was called with gas limit too low. abort entire bundle.\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n //report paymaster, since if it is not deliberately caused by the bundler,\n // it must be a revert caused by paymaster.\n revert FailedOp(opIndex, \"AA95 out of gas\");\n }\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _handlePostOp(opIndex, IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n\n /**\n * Execute a batch of UserOperations.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n } //unchecked\n }\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) public nonReentrant {\n\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n emit BeforeExecution();\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n UserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, paymasterValidationData, address(aggregator));\n opIndex++;\n }\n }\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n UserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /// @inheritdoc IEntryPoint\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external override {\n\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, op, opInfo);\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n\n numberMarker();\n uint256 paid = _executeUserOp(0, op, opInfo);\n numberMarker();\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n revert ExecutionResult(opInfo.preOpGas, paid, data.validAfter, data.validUntil, targetSuccess, targetResult);\n }\n\n\n // A memory copy of UserOp static fields only.\n // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context) external returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000) {\n assembly {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)\n return _handlePostOp(0, mode, opInfo, context, actualGas);\n }\n }\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * copy general fields from userOp into the memory opInfo structure.\n */\n function _copyUserOpToMemory(UserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n mUserOp.callGasLimit = userOp.callGasLimit;\n mUserOp.verificationGasLimit = userOp.verificationGasLimit;\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n mUserOp.maxFeePerGas = userOp.maxFeePerGas;\n mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= 20, \"AA93 invalid paymasterAndData\");\n mUserOp.paymaster = address(bytes20(paymasterAndData[: 20]));\n } else {\n mUserOp.paymaster = address(0);\n }\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external {\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n address aggregator = data.aggregator;\n bool sigFailed = aggregator == address(1);\n ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n if (aggregator != address(0) && aggregator != address(1)) {\n AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n }\n revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n }\n\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.\n // our security model might call postOp eventually twice\n uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;\n uint256 requiredGas = mUserOp.callGasLimit + mUserOp.verificationGasLimit * mul + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n // create the sender's contract if needed.\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) revert FailedOp(opIndex, \"AA10 sender already constructed\");\n address sender1 = senderCreator.createSender{gas : opInfo.mUserOp.verificationGasLimit}(initCode);\n if (sender1 == address(0)) revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n if (sender1 != sender) revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n if (sender1.code.length == 0) revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n address factory = address(bytes20(initCode[0 : 20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator.createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n function _simulationOnlyValidations(UserOperation calldata userOp) internal view {\n // solhint-disable-next-line no-empty-blocks\n try this._validateSenderAndPaymaster(userOp.initCode, userOp.sender, userOp.paymasterAndData) {}\n catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n */\n function _validateSenderAndPaymaster(bytes calldata initCode, address sender, bytes calldata paymasterAndData) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n /**\n * call account.validateUserOp.\n * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * decrement account's deposit if needed\n */\n function _validateAccountPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPrefund)\n internal returns (uint256 gasUsedByValidateAccountPrepayment, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n numberMarker();\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n try IAccount(sender).validateUserOp{gas : mUserOp.verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA23 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA23 reverted (or OOG)\");\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = uint112(deposit - requiredPrefund);\n }\n gasUsedByValidateAccountPrepayment = preGas - gasleft();\n }\n }\n\n /**\n * In case the request has a paymaster:\n * Validate paymaster has enough deposit.\n * Call paymaster.validatePaymasterUserOp.\n * Revert with proper FailedOp in case paymaster reverts.\n * Decrement paymaster's deposit\n */\n function _validatePaymasterPrepayment(uint256 opIndex, UserOperation calldata op, UserOpInfo memory opInfo, uint256 requiredPreFund, uint256 gasUsedByValidateAccountPrepayment)\n internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n require(verificationGasLimit > gasUsedByValidateAccountPrepayment, \"AA41 too little verificationGas\");\n uint256 gas = verificationGasLimit - gasUsedByValidateAccountPrepayment;\n\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = uint112(deposit - requiredPreFund);\n try IPaymaster(paymaster).validatePaymasterUserOp{gas : gas}(op, opInfo.userOpHash, requiredPreFund) returns (bytes memory _context, uint256 _validationData){\n context = _context;\n validationData = _validationData;\n } catch Error(string memory revertReason) {\n revert FailedOp(opIndex, string.concat(\"AA33 reverted: \", revertReason));\n } catch {\n revert FailedOp(opIndex, \"AA33 reverted (or OOG)\");\n }\n }\n }\n\n /**\n * revert if either account validationData or paymaster validationData is expired\n */\n function _validateAccountAndPaymasterValidationData(uint256 opIndex, uint256 validationData, uint256 paymasterValidationData, address expectedAggregator) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n function _getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * validate account and paymaster (if defined).\n * also make sure total validation doesn't exceed verificationGasLimit\n * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex the index of this userOp into the \"opInfos\" array\n * @param userOp the userOp to validate\n */\n function _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\n private returns (uint256 validationData, uint256 paymasterValidationData) {\n\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow\n uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 gasUsedByValidateAccountPrepayment;\n (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n //a \"marker\" where account opcode validation is done and paymaster opcode validation is about to start\n // (used only by off-chain simulateValidation)\n numberMarker();\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n }\n unchecked {\n uint256 gasUsed = preGas - gasleft();\n\n if (userOp.verificationGasLimit < gasUsed) {\n revert FailedOp(opIndex, \"AA40 over verificationGasLimit\");\n }\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * process post-operation.\n * called just after the callData is executed.\n * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * the excess amount is refunded to the account (or paymaster - if it was used in the request)\n * @param opIndex index in the batch\n * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)\n * @param opInfo userOp fields and info collected during validation\n * @param context the context returned in validatePaymasterUserOp\n * @param actualGas the gas used so far by this user operation\n */\n function _handlePostOp(uint256 opIndex, IPaymaster.PostOpMode mode, UserOpInfo memory opInfo, bytes memory context, uint256 actualGas) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost);\n } else {\n // solhint-disable-next-line no-empty-blocks\n try IPaymaster(paymaster).postOp{gas : mUserOp.verificationGasLimit}(mode, context, actualGasCost) {}\n catch Error(string memory reason) {\n revert FailedOp(opIndex, string.concat(\"AA50 postOp reverted: \", reason));\n }\n catch {\n revert FailedOp(opIndex, \"AA50 postOp revert\");\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n actualGasCost = actualGas * gasPrice;\n if (opInfo.prefund < actualGasCost) {\n revert FailedOp(opIndex, \"AA51 prefund below actualGasCost\");\n }\n uint256 refund = opInfo.prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emit UserOperationEvent(opInfo.userOpHash, mUserOp.sender, mUserOp.paymaster, mUserOp.nonce, success, actualGasCost, actualGas);\n } // unchecked\n }\n\n /**\n * the gas price this UserOp agrees to pay.\n * relayer/block builder might submit the TX with higher priorityFee, but the user should not\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {offset := data}\n }\n\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly {data := offset}\n }\n\n //place the NUMBER opcode in the code.\n // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the\n // account and paymaster.\n function numberMarker() internal view {\n assembly {mstore(0, number())}\n }\n}\n\n"
+ },
+ "contracts/core/Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\n/**\n * returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param aggregator - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the signature.\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n */\n struct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n }\n\n//extract sigFailed, validAfter, validUntil.\n// also convert zero validUntil to type(uint48).max\n function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n// intersect account and paymaster ranges.\n function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {\n ValidationData memory accountValidationData = _parseValidationData(validationData);\n ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);\n address aggregator = accountValidationData.aggregator;\n if (aggregator == address(0)) {\n aggregator = pmValidationData.aggregator;\n }\n uint48 validAfter = accountValidationData.validAfter;\n uint48 validUntil = accountValidationData.validUntil;\n uint48 pmValidAfter = pmValidationData.validAfter;\n uint48 pmValidUntil = pmValidationData.validUntil;\n\n if (validAfter < pmValidAfter) validAfter = pmValidAfter;\n if (validUntil > pmValidUntil) validUntil = pmValidUntil;\n return ValidationData(aggregator, validAfter, validUntil);\n }\n\n/**\n * helper to pack the return value for validateUserOp\n * @param data - the ValidationData to pack\n */\n function _packValidationData(ValidationData memory data) pure returns (uint256) {\n return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n\n/**\n * helper to pack the return value for validateUserOp, when not using an aggregator\n * @param sigFailed - true for signature failure, false for success\n * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)\n * @param validAfter first timestamp this UserOperation is valid\n */\n function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {\n return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));\n }\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n"
+ },
+ "contracts/core/NonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IEntryPoint.sol\";\n\n/**\n * nonce management functionality\n */\ncontract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"
+ },
+ "contracts/core/SenderCreator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/**\n * helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n\n /**\n * call the \"initCode\" factory to create and return the sender account address\n * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata\n * @return sender the returned address of the created account, or zero address on failure.\n */\n function createSender(bytes calldata initCode) external returns (address sender) {\n address factory = address(bytes20(initCode[0 : 20]));\n bytes memory initCallData = initCode[20 :];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly {\n success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"
+ },
+ "contracts/core/StakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(address account) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n // internal method to return just the stake info\n function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// return the deposit (for gas payment) of the account\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n function _incrementDeposit(address account, uint256 amount) internal {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n require(newAmount <= type(uint112).max, \"deposit overflow\");\n info.deposit = uint112(newAmount);\n }\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) public payable {\n _incrementDeposit(account, msg.value);\n DepositInfo storage info = deposits[account];\n emit Deposited(account, info.deposit);\n }\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(unstakeDelaySec >= info.unstakeDelaySec, \"cannot decrease unstake time\");\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(info.withdrawTime <= block.timestamp, \"Stake withdrawal is not due\");\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value : stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = uint112(info.deposit - withdrawAmount);\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value : withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"
+ },
+ "contracts/interfaces/IAccount.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\ninterface IAccount {\n\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp the operation that is about to be executed.\n * @param userOpHash hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.\n * The excess is left as a deposit in the entrypoint, for future calls.\n * can be withdrawn anytime using \"entryPoint.withdrawTo()\"\n * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.\n * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external returns (uint256 validationData);\n}\n"
+ },
+ "contracts/interfaces/IAggregator.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n\n /**\n * validate aggregated signature.\n * revert if the aggregated signature does not match the given list of operations.\n */\n function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;\n\n /**\n * validate signature of a single userOp\n * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp the userOperation received from the user.\n * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\"\n */\n function validateUserOpSignature(UserOperation calldata userOp)\n external view returns (bytes memory sigForUserOp);\n\n /**\n * aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation\n * @param userOps array of UserOperations to collect the signatures from.\n * @return aggregatedSignature the aggregated signature\n */\n function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);\n}\n"
+ },
+ "contracts/interfaces/IEntryPoint.sol": {
+ "content": "/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./UserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n\n /***\n * An event emitted after each successful request\n * @param userOpHash - unique identifier for the request (hash its entire content, except signature).\n * @param sender - the account that generates this request.\n * @param paymaster - if non-null, the paymaster that pays for this request.\n * @param nonce - the nonce value from the request.\n * @param success - true if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).\n */\n event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);\n\n /**\n * account \"sender\" was deployed.\n * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.\n * @param sender the account that is deployed\n * @param factory the factory used to deploy this account (in the initCode)\n * @param paymaster the paymaster used by this UserOp\n */\n event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length\n * @param userOpHash the request unique identifier.\n * @param sender the sender of this request\n * @param nonce the nonce used in the request\n * @param revertReason - the return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);\n\n /**\n * an event emitted by handleOps(), before starting the execution loop.\n * any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * signature aggregator used by the following UserOperationEvents within this bundle.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * a custom revert error of handleOps, to identify the offending op.\n * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)\n * @param reason - revert reason\n * The string starts with a unique code \"AAmn\", where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * error case when a signature aggregator fails to verify the aggregated signature it had created.\n */\n error SignatureValidationFailed(address aggregator);\n\n /**\n * Successful result from simulateValidation.\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n */\n error ValidationResult(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);\n\n /**\n * Successful result from simulateValidation, if the account returns a signature aggregator\n * @param returnInfo gas and time-range returned values\n * @param senderInfo stake information about the sender\n * @param factoryInfo stake information about the factory (if any)\n * @param paymasterInfo stake information about the paymaster (if any)\n * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)\n * bundler MUST use it to verify the signature, or reject the UserOperation\n */\n error ValidationResultWithAggregation(ReturnInfo returnInfo,\n StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,\n AggregatorStakeInfo aggregatorInfo);\n\n /**\n * return value of getSenderAddress\n */\n error SenderAddressResult(address sender);\n\n /**\n * return value of simulateHandleOp\n */\n error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);\n\n //UserOps handled, per aggregator\n struct UserOpsPerAggregator {\n UserOperation[] userOps;\n\n // aggregator address\n IAggregator aggregator;\n // aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperation.\n * no signature aggregator is used.\n * if any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops the operations to execute\n * @param beneficiary the address to receive the fees\n */\n function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)\n * @param beneficiary the address to receive the fees\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * generate a request Id - unique identifier for this request.\n * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n */\n function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.\n * @param userOp the user operation to validate.\n */\n function simulateValidation(UserOperation calldata userOp) external;\n\n /**\n * gas and return values during simulation\n * @param preOpGas the gas used for validation (including preValidationGas)\n * @param prefund the required prefund for this operation\n * @param sigFailed validateUserOp's (or paymaster's) signature check failed\n * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)\n * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n bool sigFailed;\n uint48 validAfter;\n uint48 validUntil;\n bytes paymasterContext;\n }\n\n /**\n * returned aggregated signature info.\n * the aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * this method always revert, and returns the address in SenderAddressResult error\n * @param initCode the constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n\n /**\n * simulate full execution of a UserOperation (including both validation and target execution)\n * this method will always revert with \"ExecutionResult\".\n * it performs full validation of the UserOperation, but ignores signature error.\n * an optional target address is called after the userop succeeds, and its value is returned\n * (before the entire call is reverted)\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op the UserOperation to simulate\n * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult\n * are set to the return from that call.\n * @param targetCallData callData to pass to target address\n */\n function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;\n}\n\n"
+ },
+ "contracts/interfaces/INonceManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"
+ },
+ "contracts/interfaces/IPaymaster.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\nimport \"./UserOperation.sol\";\n\n/**\n * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n\n enum PostOpMode {\n opSucceeded, // user op succeeded\n opReverted, // user op reverted. still has to pay for gas.\n postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.\n }\n\n /**\n * payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp the user operation\n * @param userOpHash hash of the user's request data.\n * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)\n * @return context value to send to a postOp\n * zero length to signify postOp is not required.\n * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)\n external returns (bytes memory context, uint256 validationData);\n\n /**\n * post-operation handler.\n * Must verify sender is the entryPoint\n * @param mode enum with the following options:\n * opSucceeded - user operation succeeded.\n * opReverted - user op reverted. still has to pay for gas.\n * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.\n * Now this is the 2nd call, after user's op was deliberately reverted.\n * @param context - the context value returned by validatePaymasterUserOp\n * @param actualGasCost - actual gas used so far (without this postOp call).\n */\n function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;\n}\n"
+ },
+ "contracts/interfaces/IStakeManager.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.12;\n\n/**\n * manage deposits and stakes.\n * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)\n * stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n\n event Deposited(\n address indexed account,\n uint256 totalDeposit\n );\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /// Emitted when stake or unstake delay are modified\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n /// Emitted once a stake is scheduled for withdrawal\n event StakeUnlocked(\n address indexed account,\n uint256 withdrawTime\n );\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit the entity's deposit\n * @param staked true if this entity is staked.\n * @param stake actual amount of ether staked for this entity.\n * @param unstakeDelaySec minimum delay to withdraw the stake.\n * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked\n * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)\n * and the rest fit into a 2nd cell.\n * 112 bit allows for 10^15 eth\n * 48 bit for full timestamp\n * 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint112 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n //API struct used by getStakeInfo and simulateValidation\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /// @return info - full deposit information of given account\n function getDepositInfo(address account) external view returns (DepositInfo memory info);\n\n /// @return the deposit (for gas payment) of the account\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * add to the deposit of the given account\n */\n function depositTo(address account) external payable;\n\n /**\n * add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * attempt to unlock the stake.\n * the value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * withdraw from the (unlocked) stake.\n * must first call unlockStake and wait for the unstakeDelay to pass\n * @param withdrawAddress the address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * withdraw from the deposit.\n * @param withdrawAddress the address to send withdrawn value.\n * @param withdrawAmount the amount to withdraw.\n */\n function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;\n}\n"
+ },
+ "contracts/interfaces/UserOperation.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.12;\n\n/* solhint-disable no-inline-assembly */\n\nimport {calldataKeccak} from \"../core/Helpers.sol\";\n\n/**\n * User Operation struct\n * @param sender the sender account of this request.\n * @param nonce unique value the sender uses to verify it is not a replay.\n * @param initCode if set, the account contract will be created by this constructor/\n * @param callData the method call to execute on this account.\n * @param callGasLimit the gas limit passed to the callData method call.\n * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.\n * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.\n * @param maxFeePerGas same as EIP-1559 gas parameter.\n * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.\n * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.\n * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\n struct UserOperation {\n\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n uint256 callGasLimit;\n uint256 verificationGasLimit;\n uint256 preVerificationGas;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n bytes paymasterAndData;\n bytes signature;\n }\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n function getSender(UserOperation calldata userOp) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {data := calldataload(userOp)}\n return address(uint160(data));\n }\n\n //relayer/block builder might submit the TX with higher priorityFee, but the user should not\n // pay above what he signed for.\n function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n uint256 callGasLimit = userOp.callGasLimit;\n uint256 verificationGasLimit = userOp.verificationGasLimit;\n uint256 preVerificationGas = userOp.preVerificationGas;\n uint256 maxFeePerGas = userOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n callGasLimit, verificationGasLimit, preVerificationGas,\n maxFeePerGas, maxPriorityFeePerGas,\n hashPaymasterAndData\n );\n }\n\n function hash(UserOperation calldata userOp) internal pure returns (bytes32) {\n return keccak256(pack(userOp));\n }\n\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "contracts/utils/Exec.sol": {
+ "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.5 <0.9.0;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "viaIR": true,
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/ERCS/erc-4337.md b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/ERCS/erc-4337.md
new file mode 100644
index 000000000..ef0e92370
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/ERCS/erc-4337.md
@@ -0,0 +1,1017 @@
+---
+eip: 4337
+title: Account Abstraction Using Alt Mempool
+description: An account abstraction proposal which completely avoids consensus-layer protocol changes, instead relying on higher-layer infrastructure.
+author: Vitalik Buterin (@vbuterin), Yoav Weiss (@yoavw), Dror Tirosh (@drortirosh), Shahaf Nacson (@shahafn), Alex Forshtat (@forshtat), Kristof Gazso (@kristofgazso), Tjaden Hess (@tjade273)
+discussions-to: https://ethereum-magicians.org/t/erc-4337-account-abstraction-via-entry-point-contract-specification/7160
+status: Draft
+type: Standards Track
+category: ERC
+created: 2021-09-29
+requires: 7562
+---
+
+## Abstract
+
+An account abstraction proposal which completely avoids the need for consensus-layer protocol changes. Instead of adding new protocol features and changing the bottom-layer transaction type, this proposal instead introduces a higher-layer pseudo-transaction object called a `UserOperation`. Users send `UserOperation` objects into a separate mempool. A special class of actor called bundlers package up a set of these objects into a transaction making a `handleOps` call to a special contract, and that transaction then gets included in a block.
+
+## Motivation
+
+See also `https://ethereum-magicians.org/t/implementing-account-abstraction-as-part-of-eth1-x/4020` and the links therein for historical work and motivation, and [EIP-2938](./eip-2938.md) for a consensus layer proposal for implementing the same goal.
+
+This proposal takes a different approach, avoiding any adjustments to the consensus layer. It seeks to achieve the following goals:
+
+- **Achieve the key goal of account abstraction**: allow users to use smart contract wallets containing arbitrary verification logic instead of EOAs as their primary account. Completely remove any need at all for users to also have EOAs (as status quo SC wallets and [EIP-3074](./eip-3074.md) both require)
+- **Decentralization**
+ - Allow any bundler (think: block builder) to participate in the process of including account-abstracted user operations
+ - Work with all activity happening over a public mempool; users do not need to know the direct communication addresses (eg. IP, onion) of any specific actors
+ - Avoid trust assumptions on bundlers
+- **Do not require any Ethereum consensus changes**: Ethereum consensus layer development is focusing on the merge and later on scalability-oriented features, and there may not be any opportunity for further protocol changes for a long time. Hence, to increase the chance of faster adoption, this proposal avoids Ethereum consensus changes.
+- **Try to support other use cases**
+ - Privacy-preserving applications
+ - Atomic multi-operations (similar goal to [EIP-3074])
+ - Pay tx fees with [ERC-20](./erc-20.md) tokens, allow developers to pay fees for their users, and [EIP-3074]-like **sponsored transaction** use cases more generally
+ - Support aggregated signature (e.g. BLS)
+
+## Specification
+
+### Definitions
+
+- **UserOperation** - a structure that describes a transaction to be sent on behalf of a user. To avoid confusion, it is not named "transaction".
+ - Like a transaction, it contains "sender", "to", "calldata", "maxFeePerGas", "maxPriorityFee", "signature", "nonce"
+ - unlike a transaction, it contains several other fields, described below
+ - also, the "signature" field usage is not defined by the protocol, but by each account implementation
+- **Sender** - the account contract sending a user operation.
+- **EntryPoint** - a singleton contract to execute bundles of UserOperations. Bundlers/Clients whitelist the supported entrypoint.
+- **Bundler** - a node (block builder) that can handle UserOperations,
+ create a valid an EntryPoint.handleOps() transaction,
+ and add it to the block while it is still valid.
+ This can be achieved by a number of ways:
+ - Bundler can act as a block builder itself
+ - If the bundler is not a block builder, it MUST work with the block building infrastructure such as `mev-boost` or
+ other kind of PBS (proposer-builder separation)
+ - The `bundler` can also rely on an experimental `eth_sendRawTransactionConditional` RPC API if it is available.
+- **Aggregator** - a helper contract trusted by accounts to validate an aggregated signature. Bundlers/Clients whitelist the supported aggregators.
+
+To avoid Ethereum consensus changes, we do not attempt to create new transaction types for account-abstracted transactions. Instead, users package up the action they want their account to take in a struct named `UserOperation`:
+
+| Field | Type | Description |
+| ------------------------------- | --------- | ----------------------------------------------------------------------------- |
+| `sender` | `address` | The account making the operation |
+| `nonce` | `uint256` | Anti-replay parameter (see "Semi-abstracted Nonce Support" ) |
+| `factory` | `address` | account factory, only for new accounts |
+| `factoryData` | `bytes` | data for account factory (only if account factory exists) |
+| `callData` | `bytes` | The data to pass to the `sender` during the main execution call |
+| `callGasLimit` | `uint256` | The amount of gas to allocate the main execution call |
+| `verificationGasLimit` | `uint256` | The amount of gas to allocate for the verification step |
+| `preVerificationGas` | `uint256` | Extra gas to pay the bunder |
+| `maxFeePerGas` | `uint256` | Maximum fee per gas (similar to [EIP-1559](./eip-1559.md) `max_fee_per_gas`) |
+| `maxPriorityFeePerGas` | `uint256` | Maximum priority fee per gas (similar to EIP-1559 `max_priority_fee_per_gas`) |
+| `paymaster` | `address` | Address of paymaster contract, (or empty, if account pays for itself) |
+| `paymasterVerificationGasLimit` | `uint256` | The amount of gas to allocate for the paymaster validation code |
+| `paymasterPostOpGasLimit` | `uint256` | The amount of gas to allocate for the paymaster post-operation code |
+| `paymasterData` | `bytes` | Data for paymaster (only if paymaster exists) |
+| `signature` | `bytes` | Data passed into the account to verify authorization |
+
+Users send `UserOperation` objects to a dedicated user operation mempool. The are not concerned with the packed version.
+A specialized class of actors called **bundlers** (either block builders running special-purpose code, or users that can relay transactions to block builders eg. through a bundle marketplace such as Flashbots that can guarantee next-block-or-never inclusion) listen in on the user operation mempool, and create **bundle transactions**. A bundle transaction packages up multiple `UserOperation` objects into a single `handleOps` call to a pre-published global **entry point contract**.
+
+To prevent replay attacks (both cross-chain and multiple `EntryPoint` implementations), the `signature` should depend on `chainid` and the `EntryPoint` address.
+
+When passed to on-chain contacts (the EntryPoint contract, and then to account and paymaster), a packed version of the above structure is used:
+
+| Field | Type | Description |
+| -------------------- | --------- | ---------------------------------------------------------------------- |
+| `sender` | `address` | |
+| `nonce` | `uint256` | |
+| `initCode` | `bytes` | concatenation of factory address and factoryData (or empty) |
+| `callData` | `bytes` | |
+| `accountGasLimits` | `bytes32` | concatenation of verificationGas (16 bytes) and callGas (16 bytes) |
+| `preVerificationGas` | `uint256` | |
+| `gasFees` | `bytes32` | concatenation of maxPriorityFee (16 bytes) and maxFeePerGas (16 bytes) |
+| `paymasterAndData` | `bytes` | concatenation of paymaster fields (or empty) |
+| `signature` | `bytes` | |
+
+The core interface of the entry point contract is as follows:
+
+```solidity
+function handleOps(PackedUserOperation[] calldata ops, address payable beneficiary);
+
+function handleAggregatedOps(
+ UserOpsPerAggregator[] calldata opsPerAggregator,
+ address payable beneficiary
+);
+
+struct UserOpsPerAggregator {
+ PackedUserOperation[] userOps;
+ IAggregator aggregator;
+ bytes signature;
+}
+```
+
+The core interface required for an account to have is:
+
+```solidity
+interface IAccount {
+ function validateUserOp
+ (PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)
+ external returns (uint256 validationData);
+}
+```
+
+The `userOpHash` is a hash over the userOp (except signature), entryPoint and chainId.
+
+The account:
+
+- MUST validate the caller is a trusted EntryPoint
+- If the account does not support signature aggregation, it MUST validate the signature is a valid signature of the `userOpHash`, and
+ SHOULD return SIG_VALIDATION_FAILED (and not revert) on signature mismatch. Any other error MUST revert.
+- MUST pay the entryPoint (caller) at least the "missingAccountFunds" (which might be zero, in case current account's deposit is high enough)
+- The account MAY pay more than this minimum, to cover future transactions (it can always issue `withdrawTo` to retrieve it)
+- The return value MUST be packed of `authorizer`, `validUntil` and `validAfter` timestamps.
+ - authorizer - 0 for valid signature, 1 to mark signature failure. Otherwise, an address of an authorizer contract. This ERC defines "signature aggregator" as authorizer.
+ - `validUntil` is 6-byte timestamp value, or zero for "infinite". The UserOp is valid only up to this time.
+ - `validAfter` is 6-byte timestamp. The UserOp is valid only after this time.
+
+An account that works with aggregated signature, should return its signature aggregator address in the "sigAuthorizer" return value of validateUserOp.
+It MAY ignore the signature field.
+
+The account MAY implement the interface `IAccountExecute`
+
+```solidity
+interface IAccountExecute {
+ function executeUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash) external;
+}
+```
+
+This method will be called by the entryPoint with the current UserOperation, instead of executing the `callData` itself on the account.
+
+The core interface required by an aggregator is:
+
+```solidity
+interface IAggregator {
+
+ function validateUserOpSignature(PackedUserOperation calldata userOp)
+ external view returns (bytes memory sigForUserOp);
+
+ function aggregateSignatures(PackedUserOperation[] calldata userOps) external view returns (bytes memory aggregatesSignature);
+
+ function validateSignatures(PackedUserOperation[] calldata userOps, bytes calldata signature) view external;
+}
+```
+
+- If an account uses an aggregator (returns it from validateUserOp), then its address is returned by `simulateValidation()` (in `aggregatorInfo`)
+- To accept the UserOp, the bundler must call **validateUserOpSignature()** to validate the userOp's signature.
+- **aggregateSignatures()** must aggregate all UserOp signature into a single value.
+- Note that the above methods are helper method for the bundler. The bundler MAY use a native library to perform the same validation and aggregation logic.
+- **validateSignatures()** MUST validate the aggregated signature matches for all UserOperations in the array, and revert otherwise.
+ This method is called on-chain by `handleOps()`
+
+#### Semi-abstracted Nonce Support
+
+In Ethereum protocol, the sequential transaction `nonce` value is used as a replay protection method as well as to
+determine the valid order of transaction being included in blocks.
+
+It also contributes to the transaction hash uniqueness, as a transaction by the same sender with the same
+nonce may not be included in the chain twice.
+
+However, requiring a single sequential `nonce` value is limiting the senders' ability to define their custom logic
+with regard to transaction ordering and replay protection.
+
+Instead of sequential `nonce` we implement a nonce mechanism that uses a single `uint256` nonce value in the `UserOperation`,
+but treats it as two values:
+
+- 192-bit "key"
+- 64-bit "sequence"
+
+These values are represented on-chain in the `EntryPoint` contract.
+We define the following method in the `EntryPoint` interface to expose these values:
+
+```solidity
+function getNonce(address sender, uint192 key) external view returns (uint256 nonce);
+```
+
+For each `key` the `sequence` is validated and incremented sequentially and monotonically by the `EntryPoint` for
+each UserOperation, however a new key can be introduced with an arbitrary value at any point.
+
+This approach maintains the guarantee of `UserOperation` hash uniqueness on-chain on the protocol level while allowing
+wallets to implement any custom logic they may need operating on a 192-bit "key" field, while fitting the 32 byte word.
+
+##### Reading and validating the nonce
+
+When preparing the UserOp clients may make a view call to this method to determine a valid value for the `nonce` field.
+
+Bundler's validation of a UserOp should start with `getNonce` to ensure the transaction has a valid `nonce` field.
+
+If the bundler is willing to accept multiple UserOperations by the same sender into their mempool,
+this bundler is supposed to track the `key` and `sequence` pair of the UserOperations already added in the mempool.
+
+##### Usage examples
+
+1. Classic sequential nonce.
+
+ In order to require the wallet to have classic, sequential nonce, the validation function should perform:
+
+ ```solidity
+ require(userOp.nonce> 64;
+ if (sig == ADMIN_METHODSIG) {
+ require(key == ADMIN_KEY, "wrong nonce-key for admin operation");
+ } else {
+ require(key == 0, "wrong nonce-key for normal operation");
+ }
+ ```
+
+#### Using signature aggregators
+
+An account signifies it uses signature aggregation returning its address from `validateUserOp`.
+During `simulateValidation`, this aggregator is returned as part of the `aggregatorInfo` struct.
+
+The bundler should first accept the aggregator (validate its stake info and that it is not throttled/banned)
+Then it MUST verify the userOp using `aggregator.validateUserOpSignature()`. This method returned an alternate signature (usually empty) that should be used during bundling.
+The bundler MUST call `validateUserOp` a second time on the account with the UserOperation using that returned signature.
+
+Signature aggregator MUST be staked.
+Bundlers MAY throttle down and ban aggregators in case they take too much resources (or revert) when the above methods are called in view mode, or if the signature aggregation fails.
+
+### Required entry point contract functionality
+
+There are 2 separate entry point methods: `handleOps` and `handleAggregatedOps`
+
+- `handleOps` handle userOps of accounts that don't require any signature aggregator.
+- `handleAggregatedOps` can handle a batch that contains userOps of multiple aggregators (and also requests without any aggregator)
+- `handleAggregatedOps` performs the same logic below as `handleOps`, but it must transfer the correct aggregator to each userOp, and also must call `validateSignatures` on each aggregator before doing all the per-account validation.
+ The entry point's `handleOps` function must perform the following steps (we first describe the simpler non-paymaster case). It must make two loops, the **verification loop** and the **execution loop**. In the verification loop, the `handleOps` call must perform the following steps for each `UserOperation`:
+
+- **Create the account if it does not yet exist**, using the initcode provided in the `UserOperation`. If the account does not exist, _and_ the initcode is empty, or does not deploy a contract at the "sender" address, the call must fail.
+- calculate the maximum possible fee the account needs to pay (based on validation and call gas limits, and current gas values)
+- calculate the fee the account must add to its "deposit" in the EntryPoint
+- **Call `validateUserOp` on the account**, passing in the `UserOperation`, its hash and the required fee. The account should verify the operation's signature, and pay the fee if the account considers the operation valid. If any `validateUserOp` call fails, `handleOps` must skip execution of at least that operation, and may revert entirely.
+- Validate the account's deposit in the entryPoint is high enough to cover the max possible cost (cover the already-done verification and max execution gas)
+
+In the execution loop, the `handleOps` call must perform the following steps for each `UserOperation`:
+
+- **Call the account with the `UserOperation`'s calldata**. It's up to the account to choose how to parse the calldata; an expected workflow is for the account to have an `execute` function that parses the remaining calldata as a series of one or more calls that the account should make.
+- If the calldata starts with the methodsig `IAccountExecute.executeUserOp`, then the EntryPoint must build a calldata by encoding `executeUserOp(userOp,userOpHash)` and call the account using that calldata.
+- After the call, refund the account's deposit with the excess gas cost that was pre-charged.\
+ A penalty of `10%` (`UNUSED_GAS_PENALTY_PERCENT`) is applied on the amount of gas that is refunded.\
+ This penalty is necessary to prevent the UserOps from reserving large parts of the gas space in the bundle but leaving it unused and preventing the bundler from including other UserOperations.
+- After the execution of all calls, pay the collected fees from all UserOperations to the bundler's provided address
+
+
+
+Before accepting a `UserOperation`, bundlers should use an RPC method to locally call the `simulateValidation` function on the entry point, to verify that the signature is correct and the operation actually pays fees; see the [Simulation section below](#simulation) for details.
+A node/bundler SHOULD drop (not add to the mempool) a `UserOperation` that fails the validation
+
+### Extension: paymasters
+
+We extend the entry point logic to support **paymasters** that can sponsor transactions for other users. This feature can be used to allow application developers to subsidize fees for their users, allow users to pay fees with [ERC-20](./erc-20.md) tokens and many other use cases. When the paymasterAndData field in the UserOp is not empty, the entry point implements a different flow for that UserOperation:
+
+
+
+During the verification loop, in addition to calling `validateUserOp`, the `handleOps` execution also must check that the paymaster has enough ETH deposited with the entry point to pay for the operation, and then call `validatePaymasterUserOp` on the paymaster to verify that the paymaster is willing to pay for the operation. Note that in this case, the `validateUserOp` is called with a `missingAccountFunds` of 0 to reflect that the account's deposit is not used for payment for this userOp.
+
+If the paymaster's validatePaymasterUserOp returns a "context", then `handleOps` must call `postOp` on the paymaster after making the main execution call.
+
+Maliciously crafted paymasters _can_ DoS the system. To prevent this, we use a reputation system. paymaster must either limit its storage usage, or have a stake. see the [reputation, throttling and banning section](#reputation-scoring-and-throttlingbanning-for-global-entities) for details.
+
+The paymaster interface is as follows:
+
+```solidity
+function validatePaymasterUserOp
+ (PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)
+ external returns (bytes memory context, uint256 validationData);
+
+function postOp
+ (PostOpMode mode, bytes calldata context, uint256 actualGasCost, uint256 actualUserOpFeePerGas)
+ external;
+
+enum PostOpMode {
+ opSucceeded, // user op succeeded
+ opReverted, // user op reverted. still has to pay for gas.
+ postOpReverted // Regardless of the UserOp call status, the postOp reverted, and caused both executions to revert.
+}
+```
+
+The EntryPoint must implement the following API to let entities like paymasters to have a stake, and thus have more flexibility in their storage access (see [reputation, throttling and banning section](#reputation-scoring-and-throttlingbanning-for-global-entities) for details.)
+
+```solidity
+// add a stake to the calling entity
+function addStake(uint32 _unstakeDelaySec) external payable
+
+// unlock the stake (must wait unstakeDelay before can withdraw)
+function unlockStake() external
+
+// withdraw the unlocked stake
+function withdrawStake(address payable withdrawAddress) external
+```
+
+The paymaster must also have a deposit, which the entry point will charge UserOperation costs from.
+The deposit (for paying gas fees) is separate from the stake (which is locked).
+
+The EntryPoint must implement the following interface to allow paymasters (and optionally accounts) manage their deposit:
+
+```c++
+// return the deposit of an account
+function balanceOf(address account) public view returns (uint256)
+
+// add to the deposit of the given account
+function depositTo(address account) public payable
+
+// withdraw from the deposit of the current account
+function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external
+```
+
+### Client behavior upon receiving a UserOperation
+
+When a client receives a `UserOperation`, it must first run some basic sanity checks, namely that:
+
+- Either the `sender` is an existing contract, or the `initCode` is not empty (but not both)
+- If `initCode` is not empty, parse its first 20 bytes as a factory address. Record whether the factory is staked, in case the later simulation indicates that it needs to be. If the factory accesses global state, it must be staked - see [reputation, throttling and banning section](#reputation-scoring-and-throttlingbanning-for-global-entities) for details.
+- The `verificationGasLimit` is sufficiently low (`<= MAX_VERIFICATION_GAS`) and the `preVerificationGas` is sufficiently high (enough to pay for the calldata gas cost of serializing the `UserOperation` plus `PRE_VERIFICATION_OVERHEAD_GAS`)
+- The `paymasterAndData` is either empty, or start with the **paymaster** address, which is a contract that (i) currently has nonempty code on chain, (ii) has a sufficient deposit to pay for the UserOperation, and (iii) is not currently banned. During simulation, the paymaster's stake is also checked, depending on its storage usage - see [reputation, throttling and banning section](#reputation-scoring-and-throttlingbanning-for-global-entities) for details.
+- The callgas is at least the cost of a `CALL` with non-zero value.
+- The `maxFeePerGas` and `maxPriorityFeePerGas` are above a configurable minimum value that the client is willing to accept. At the minimum, they are sufficiently high to be included with the current `block.basefee`.
+- The sender doesn't have another `UserOperation` already present in the pool (or it replaces an existing entry with the same sender and nonce, with a higher `maxPriorityFeePerGas` and an equally increased `maxFeePerGas`). Only one `UserOperation` per sender may be included in a single batch. A sender is exempt from this rule and may have multiple `UserOperations` in the pool and in a batch if it is staked (see [reputation, throttling and banning section](#reputation-scoring-and-throttlingbanning-for-global-entities) below), but this exception is of limited use to normal accounts.
+
+If the `UserOperation` object passes these sanity checks, the client must next run the first op simulation, and if the simulation succeeds, the client must add the op to the pool. A second simulation must also happen during bundling to make sure the UserOperation is still valid.
+
+### Simulation
+
+#### Simulation Rationale
+
+In order to add a UserOperation into the mempool (and later to add it into a bundle) we need to "simulate" its validation to make sure it is valid, and that it is capable of paying for its own execution.
+In addition, we need to verify that the same will hold true when executed on-chain.
+For this purpose, a UserOperation is not allowed to access any information that might change between simulation and execution, such as current block time, number, hash etc.
+In addition, a UserOperation is only allowed to access data related to this sender address: Multiple UserOperations should not access the same storage, so that it is impossible to invalidate a large number of UserOperations with a single state change.
+There are 3 special contracts that interact with the account: the factory (initCode) that deploys the contract, the paymaster that can pay for the gas, and signature aggregator (described later)
+Each of these contracts is also restricted in its storage access, to make sure UserOperation validations are isolated.
+
+#### Specification:
+
+To simulate a `UserOperation` validation, the client makes a view call to `simulateValidation(userop)`.
+
+The EntryPoint itself does not implement the simulation methods. Instead, when making the simulation view call,
+The bundler should provide the alternate EntryPointSimulations code, which extends the EntryPoint with the simulation methods.
+
+The simulation core methods:
+
+```solidity
+
+struct ValidationResult {
+ ReturnInfo returnInfo;
+ StakeInfo senderInfo;
+ StakeInfo factoryInfo;
+ StakeInfo paymasterInfo;
+ AggregatorStakeInfo aggregatorInfo;
+}
+
+function simulateValidation(PackedUserOperation calldata userOp)
+external returns (ValidationResult memory);
+
+struct ReturnInfo {
+ uint256 preOpGas;
+ uint256 prefund;
+ uint256 accountValidationData;
+ uint256 paymasterValidationData;
+ bytes paymasterContext;
+}
+
+struct AggregatorStakeInfo {
+ address aggregator;
+ StakeInfo stakeInfo;
+}
+
+struct StakeInfo {
+ uint256 stake;
+ uint256 unstakeDelaySec;
+}
+
+
+```
+
+This method returns `ValidationResult` or revert on validation failure.
+The node should drop the UserOperation if the simulation fails (either by revert or by "signature failure")
+
+The simulated call performs the full validation, by calling:
+
+1. If `initCode` is present, create the account.
+2. `account.validateUserOp`.
+3. if specified a paymaster: `paymaster.validatePaymasterUserOp`.
+
+The simulateValidation should validate the return value (validationData) returned by the account's `validateUserOp` and paymaster's `validatePaymasterUserOp`.
+The account MAY return an aggregator. See [Using Signature Aggregator](#using-signature-aggregators)
+The paymaster MUST return either "0" (success) or SIG_VALIDATION_FAILED for aggregator, and not an address.
+Either return value may contain a "validAfter" and "validUntil" timestamps, which is the time-range that this UserOperation is valid on-chain.
+A node MAY drop a UserOperation if it expires too soon (e.g. wouldn't make it to the next block) by either the account or paymaster.
+If the `ValidationResult` includes `sigFail`, the client SHOULD drop the `UserOperation`.
+
+In order to prevent DoS attack on bundlers, they must make sure the validation methods above pass the validation rules, which constraint their usage of opcodes and storage.
+For the complete procedure see [ERC-7562](./erc-7562.md)
+
+#### Alternative Mempools
+
+The simulation rules above are strict and prevent the ability of paymasters and signature aggregators to grief the system.
+However, there might be use-cases where specific paymasters (and signature aggregators) can be validated
+(through manual auditing) and verified that they cannot cause any problem, while still require relaxing of the opcode rules.
+A bundler cannot simply "whitelist" request from a specific paymaster: if that paymaster is not accepted by all
+bundlers, then its support will be sporadic at best.
+Instead, we introduce the term "alternate mempool": a modified validation rules, and procedure of propagating them to other bundlers.
+
+The procedure of using alternate mempools is defined in [ERC-7562](./erc-7562.md#Alt-mempools-rules)
+
+### Bundling
+
+During bundling, the client should:
+
+- Exclude UserOps that access any sender address of another UserOp in the same batch.
+- Exclude UserOps that access any address created by another UserOp validation in the same batch (via a factory).
+- For each paymaster used in the batch, keep track of the balance while adding UserOps. Ensure that it has sufficient deposit to pay for all the UserOps that use it.
+- Sort UserOps by aggregator, to create the lists of UserOps-per-aggregator.
+- For each aggregator, run the aggregator-specific code to create aggregated signature, and update the UserOps
+
+After creating the batch, before including the transaction in a block, the client should:
+
+- Run `debug_traceCall` with maximum possible gas, to enforce the validation rules on opcode and storage access.
+ as well as to verify the entire `handleOps` batch transaction,
+ and use the consumed gas for the actual transaction execution.
+- If the call reverted, the bundler MUST use the trace result to find the entity that reverted the call. \
+ This is the last entity that is CALL'ed by the EntryPoint prior to the revert. \
+ (the bundler cannot assume the revert is `FailedOp`)
+- If any verification context rule was violated the bundlers should treat it the same as
+ if this UserOperation reverted.
+- Remove the offending UserOperation from the current bundle and from mempool.
+- If the error is caused by a `factory` or a `paymaster`, and the `sender`
+ of the UserOp **is not** a staked entity, then issue a "ban" (see ["Reputation, throttling and banning"](#reputation-scoring-and-throttlingbanning-for-global-entities))
+ for the guilty factory or paymaster.
+- If the error is caused by a `factory` or a `paymaster`, and the `sender`
+ of the UserOp **is** a staked entity, do not ban the `factory` / `paymaster` from the mempool.
+ Instead, issue a "ban" for the staked `sender` entity.
+- Repeat until `debug_traceCall` succeeds.
+
+As staked entries may use some kind of transient storage to communicate data between UserOperations in the same bundle,
+it is critical that the exact same opcode and precompile banning rules as well as storage access rules are enforced
+for the `handleOps` validation in its entirety as for individual UserOperations.
+Otherwise, attackers may be able to use the banned opcodes to detect running on-chain and trigger a `FailedOp` revert.
+
+When a bundler includes a bundle in a block it must ensure that earlier transactions in the block don't make any UserOperation fail. It should either use access lists to prevent conflicts, or place the bundle as the first transaction in the block.
+
+### Error codes.
+
+While performing validation, the EntryPoint must revert on failures. During simulation, the calling bundler MUST be able to determine which entity (factory, account or paymaster) caused the failure.
+The attribution of revert to entity is done using the call-tracing: the last entity called by the EntryPoint prior the revert is the entity that caused the revert.
+
+- For diagnostic purposes, the EntryPoint must only revert with explicit FailedOp() or FailedOpWithRevert() errors.
+- The message of the error starts with event code, AA##
+- Event code starting with "AA1" signify an error during account creation
+- Event code starting with "AA2" signify an error during account validation (validateUserOp)
+- Event code starting with "AA3" signify an error during paymaster validation (validatePaymasterUserOp)
+
+## Rationale
+
+The main challenge with a purely smart contract wallet based account abstraction system is DoS safety: how can a block builder including an operation make sure that it will actually pay fees, without having to first execute the entire operation? Requiring the block builder to execute the entire operation opens a DoS attack vector, as an attacker could easily send many operations that pretend to pay a fee but then revert at the last moment after a long execution. Similarly, to prevent attackers from cheaply clogging the mempool, nodes in the P2P network need to check if an operation will pay a fee before they are willing to forward it.
+
+The first step is clean separation between validation (acceptance of UserOperation, and acceptance to pay) and execution.
+In this proposal, we expect accounts to have a `validateUserOp` method that takes as input a `UserOperation`, and verify the signature and pay the fee.
+Only if this method returns successfully, the execution will happen.
+
+The entry point-based approach allows for a clean separation between verification and execution, and keeps accounts' logic simple. It enforces the simple rule that only after validation is successful (and the UserOp can pay), the execution is done, and also guarantees the fee payment.
+
+The last step is protecting the bundlers from denial-of-service attacks by a mass number of UserOperation that appear to be valid (and pay) but that eventually revert, and thus block the bundler from processing valid UserOperations.
+For this purpose, the bundler requires a set of [restrictions on the validation function](./erc-7526.md), to prevent such denial-of-service attacks.
+
+### Reputation scoring and throttling/banning for global entities
+
+#### Reputation Rationale.
+
+UserOperation's storage access rules prevent them from interfere with each other.
+But "global" entities - paymasters, factories and aggregators are accessed by multiple UserOperations, and thus might invalidate multiple previously-valid UserOperations.
+
+To prevent abuse, we throttle down (or completely ban for a period of time) an entity that causes invalidation of large number of UserOperations in the mempool.
+To prevent such entities from "sybil-attack", we require them to stake with the system, and thus make such DoS attack very expensive.
+Note that this stake is never slashed, and can be withdrawn any time (after unstake delay)
+
+Unstaked entities are allowed, under the rules below.
+
+When staked, an entity is less restricted in its memory usage.
+
+The stake value is not enforced on-chain, but specifically by each node while simulating a transaction.
+
+### Paymasters
+
+Paymaster contracts allow abstraction of gas: having a contract, that is not the sender of the transaction, pay for the transaction fees.
+
+Paymaster architecture allows them to follow the model of "pre-charge, and later refund".
+E.g. a token-paymaster may pre-charge the user with the max possible price of the transaction, and refund the user with the excess afterwards.
+
+### First-time account creation
+
+It is an important design goal of this proposal to replicate the key property of EOAs that users do not need to perform some custom action or rely on an existing user to create their wallet; they can simply generate an address locally and immediately start accepting funds.
+
+The wallet creation itself is done by a "factory" contract, with wallet-specific data.
+The factory is expected to use CREATE2 (not CREATE) to create the wallet, so that the order of creation of wallets doesn't interfere with the generated addresses.
+The `initCode` field (if non-zero length) is parsed as a 20-byte address, followed by "calldata" to pass to this address.
+This method call is expected to create a wallet and return its address.
+If the factory does use CREATE2 or some other deterministic method to create the wallet, it's expected to return the wallet address even if the wallet has already been created. This is to make it easier for clients to query the address without knowing if the wallet has already been deployed, by simulating a call to `entryPoint.getSenderAddress()`, which calls the factory under the hood.
+When `initCode` is specified, if either the `sender` address points to an existing contract, or (after calling the initCode) the `sender` address still does not exist,
+then the operation is aborted.
+The `initCode` MUST NOT be called directly from the entryPoint, but from another address.
+The contract created by this factory method should accept a call to `validateUserOp` to validate the UserOp's signature.
+For security reasons, it is important that the generated contract address will depend on the initial signature.
+This way, even if someone can create a wallet at that address, he can't set different credentials to control it.
+The factory has to be staked if it accesses global storage - see [reputation, throttling and banning section](#reputation-scoring-and-throttlingbanning-for-global-entities) for details.
+
+NOTE: In order for the wallet to determine the "counterfactual" address of the wallet (prior its creation),
+it should make a static call to the `entryPoint.getSenderAddress()`
+
+### Entry point upgrading
+
+Accounts are encouraged to be DELEGATECALL forwarding contracts for gas efficiency and to allow account upgradability. The account code is expected to hard-code the entry point into their code for gas efficiency. If a new entry point is introduced, whether to add new functionality, improve gas efficiency, or fix a critical security bug, users can self-call to replace their account's code address with a new code address containing code that points to a new entry point. During an upgrade process, it's expected that two mempools will run in parallel.
+
+### RPC methods (eth namespace)
+
+#### \* eth_sendUserOperation
+
+eth_sendUserOperation submits a User Operation object to the User Operation pool of the client. The client MUST validate the UserOperation, and return a result accordingly.
+
+The result `SHOULD` be set to the **userOpHash** if and only if the request passed simulation and was accepted in the client's User Operation pool. If the validation, simulation, or User Operation pool inclusion fails, `result` `SHOULD NOT` be returned. Rather, the client `SHOULD` return the failure reason.
+
+##### Parameters:
+
+1. **UserOperation** a full user-operation struct. All fields MUST be set as hex values. empty `bytes` block (e.g. empty `initCode`) MUST be set to `"0x"`
+2. **factory** and **factoryData** - either both exist, or none
+3. paymaster fields (**paymaster**, **paymasterData**, **paymasterValidationGasLimit**, **paymasterPostOpGasLimit**) either all exist, or none.
+4. **EntryPoint** the entrypoint address the request should be sent through. this MUST be one of the entry points returned by the `supportedEntryPoints` rpc call.
+
+##### Return value:
+
+- If the UserOperation is valid, the client MUST return the calculated **userOpHash** for it
+- in case of failure, MUST return an `error` result object, with `code` and `message`. The error code and message SHOULD be set as follows:
+ - **code: -32602** - invalid UserOperation struct/fields
+ - **code: -32500** - transaction rejected by entryPoint's simulateValidation, during wallet creation or validation
+ - The `message` field MUST be set to the FailedOp's "`AAxx`" error message from the EntryPoint
+ - **code: -32501** - transaction rejected by paymaster's validatePaymasterUserOp
+ - The `message` field SHOULD be set to the revert message from the paymaster
+ - The `data` field MUST contain a `paymaster` value
+ - **code: -32502** - transaction rejected because of opcode validation
+ - **code: -32503** - UserOperation out of time-range: either wallet or paymaster returned a time-range, and it is already expired (or will expire soon)
+ - The `data` field SHOULD contain the `validUntil` and `validAfter` values
+ - The `data` field SHOULD contain a `paymaster` value, if this error was triggered by the paymaster
+ - **code: -32504** - transaction rejected because paymaster (or signature aggregator) is throttled/banned
+ - The `data` field SHOULD contain a `paymaster` or `aggregator` value, depending on the failed entity
+ - **code: -32505** - transaction rejected because paymaster (or signature aggregator) stake or unstake-delay is too low
+ - The `data` field SHOULD contain a `paymaster` or `aggregator` value, depending on the failed entity
+ - The `data` field SHOULD contain a `minimumStake` and `minimumUnstakeDelay`
+ - **code: -32506** - transaction rejected because wallet specified unsupported signature aggregator
+ - The `data` field SHOULD contain an `aggregator` value
+ - **code: -32507** - transaction rejected because of wallet signature check failed (or paymaster signature, if the paymaster uses its data as signature)
+
+##### Example:
+
+Request:
+
+```json=
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "eth_sendUserOperation",
+ "params": [
+ {
+ sender, // address
+ nonce, // uint256
+ factory, // address
+ factoryData, // bytes
+ callData, // bytes
+ callGasLimit, // uint256
+ verificationGasLimit, // uint256
+ preVerificationGas, // uint256
+ maxFeePerGas, // uint256
+ maxPriorityFeePerGas, // uint256
+ paymaster, // address
+ paymasterVerificationGasLimit, // uint256
+ paymasterPostOpGasLimit, // uint256
+ paymasterData, // bytes
+ signature // bytes
+ },
+ entryPoint // address
+ ]
+}
+
+```
+
+Response:
+
+```
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "0x1234...5678"
+}
+```
+
+##### Example failure responses:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "error": {
+ "message": "AA21 didn't pay prefund",
+ "code": -32500
+ }
+}
+```
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "error": {
+ "message": "paymaster stake too low",
+ "data": {
+ "paymaster": "0x123456789012345678901234567890123456790",
+ "minimumStake": "0xde0b6b3a7640000",
+ "minimumUnstakeDelay": "0x15180"
+ },
+ "code": -32504
+ }
+}
+```
+
+#### \* eth_estimateUserOperationGas
+
+Estimate the gas values for a UserOperation.
+Given UserOperation optionally without gas limits and gas prices, return the needed gas limits.
+The signature field is ignored by the wallet, so that the operation will not require user's approval.
+Still, it might require putting a "semi-valid" signature (e.g. a signature in the right length)
+
+**Parameters**:
+
+- Same as `eth_sendUserOperation`\
+ gas limits (and prices) parameters are optional, but are used if specified.
+ `maxFeePerGas` and `maxPriorityFeePerGas` default to zero, so no payment is required by neither account nor paymaster.
+- Optionally accepts the `State Override Set` to allow users to modify the state during the gas estimation.\
+ This field as well as its behavior is equivalent to the ones defined for `eth_call` RPC method.
+
+**Return Values:**
+
+- **preVerificationGas** gas overhead of this UserOperation
+- **verificationGasLimit** actual gas used by the validation of this UserOperation
+- **callGasLimit** value used by inner account execution
+- **paymasterVerificationGasLimit** value used for paymaster verification (if paymaster exists in the UserOperation)
+- **paymasterPostOpGasLimit** value used for paymaster post op execution (if paymaster exists in the UserOperation)
+
+##### Error Codes:
+
+Same as `eth_sendUserOperation`
+This operation may also return an error if the inner call to the account contract reverts.
+
+#### \* eth_getUserOperationByHash
+
+Return a UserOperation based on a hash (userOpHash) returned by `eth_sendUserOperation`
+
+**Parameters**
+
+- **hash** a userOpHash value returned by `eth_sendUserOperation`
+
+**Return value**:
+
+- If the UserOperation is included in a block:
+ - Return a full UserOperation, with the addition of `entryPoint`, `blockNumber`, `blockHash` and `transactionHash`.
+
+- Else if the UserOperation is pending in the bundler's mempool:
+ - MAY return `null`, or: a full UserOperation, with the addition of the `entryPoint` field and a `null` value for `blockNumber`, `blockHash` and `transactionHash`.
+
+- Else:
+ - Return `null`
+
+#### \* eth_getUserOperationReceipt
+
+Return a UserOperation receipt based on a hash (userOpHash) returned by `eth_sendUserOperation`
+
+**Parameters**
+
+- **hash** a userOpHash value returned by `eth_sendUserOperation`
+
+**Return value**:
+
+`null` in case the UserOperation is not yet included in a block, or:
+
+- **userOpHash** the request hash
+- **entryPoint**
+- **sender**
+- **nonce**
+- **paymaster** the paymaster used for this userOp (or empty)
+- **actualGasCost** - actual amount paid (by account or paymaster) for this UserOperation
+- **actualGasUsed** - total gas used by this UserOperation (including preVerification, creation, validation and execution)
+- **success** boolean - did this execution completed without revert
+- **reason** in case of revert, this is the revert reason
+- **logs** the logs generated by this UserOperation (not including logs of other UserOperations in the same bundle)
+- **receipt** the TransactionReceipt object.
+ Note that the returned TransactionReceipt is for the entire bundle, not only for this UserOperation.
+
+#### \* eth_supportedEntryPoints
+
+Returns an array of the entryPoint addresses supported by the client. The first element of the array `SHOULD` be the entryPoint addressed preferred by the client.
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "eth_supportedEntryPoints",
+ "params": []
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": [
+ "0xcd01C8aa8995A59eB7B2627E69b40e0524B5ecf8",
+ "0x7A0A0d159218E6a2f407B99173A2b12A6DDfC2a6"
+ ]
+}
+```
+
+#### \* eth_chainId
+
+Returns [EIP-155](./eip-155.md) Chain ID.
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "eth_chainId",
+ "params": []
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "0x1"
+}
+```
+
+### RPC methods (debug Namespace)
+
+This api must only be available on testing mode and is required by the compatibility test suite. In production, any `debug_*` rpc calls should be blocked.
+
+#### \* debug_bundler_clearState
+
+Clears the bundler mempool and reputation data of paymasters/accounts/factories/aggregators.
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "debug_bundler_clearState",
+ "params": []
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "ok"
+}
+```
+
+#### \* debug_bundler_dumpMempool
+
+Dumps the current UserOperations mempool
+
+**Parameters:**
+
+- **EntryPoint** the entrypoint used by eth_sendUserOperation
+
+**Returns:**
+
+`array` - Array of UserOperations currently in the mempool.
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "debug_bundler_dumpMempool",
+ "params": ["0x1306b01bC3e4AD202612D3843387e94737673F53"]
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": [
+ {
+ sender, // address
+ nonce, // uint256
+ factory, // address
+ factoryData, // bytes
+ callData, // bytes
+ callGasLimit, // uint256
+ verificationGasLimit, // uint256
+ preVerificationGas, // uint256
+ maxFeePerGas, // uint256
+ maxPriorityFeePerGas, // uint256
+ signature // bytes
+ }
+ ]
+}
+```
+
+#### \* debug_bundler_sendBundleNow
+
+Forces the bundler to build and execute a bundle from the mempool as `handleOps()` transaction.
+
+Returns: `transactionHash`
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "debug_bundler_sendBundleNow",
+ "params": []
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "0xdead9e43632ac70c46b4003434058b18db0ad809617bd29f3448d46ca9085576"
+}
+```
+
+#### \* debug_bundler_setBundlingMode
+
+Sets bundling mode.
+
+After setting mode to "manual", an explicit call to debug_bundler_sendBundleNow is required to send a bundle.
+
+##### parameters:
+
+`mode` - 'manual' | 'auto'
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "debug_bundler_setBundlingMode",
+ "params": ["manual"]
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "ok"
+}
+```
+
+#### \* debug_bundler_setReputation
+
+Sets reputation of given addresses. parameters:
+
+**Parameters:**
+
+- An array of reputation entries to add/replace, with the fields:
+ - `address` - The address to set the reputation for.
+ - `opsSeen` - number of times a user operations with that entity was seen and added to the mempool
+ - `opsIncluded` - number of times a user operations that uses this entity was included on-chain
+
+- **EntryPoint** the entrypoint used by eth_sendUserOperation
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "debug_bundler_setReputation",
+ "params": [
+ [
+ {
+ "address": "0x7A0A0d159218E6a2f407B99173A2b12A6DDfC2a6",
+ "opsSeen": "0x14",
+ "opsIncluded": "0x0D"
+ }
+ ],
+ "0x1306b01bC3e4AD202612D3843387e94737673F53"
+ ]
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "ok"
+}
+```
+
+#### \* debug_bundler_dumpReputation
+
+Returns the reputation data of all observed addresses.
+Returns an array of reputation objects, each with the fields described above in `debug_bundler_setReputation` with the
+
+**Parameters:**
+
+- **EntryPoint** the entrypoint used by eth_sendUserOperation
+
+**Return value:**
+
+An array of reputation entries with the fields:
+
+- `address` - The address to set the reputation for.
+- `opsSeen` - number of times a user operations with that entity was seen and added to the mempool
+- `opsIncluded` - number of times a user operations that uses this entity was included on-chain
+- `status` - (string) The status of the address in the bundler 'ok' | 'throttled' | 'banned'.
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "debug_bundler_dumpReputation",
+ "params": ["0x1306b01bC3e4AD202612D3843387e94737673F53"]
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": [
+ { "address": "0x7A0A0d159218E6a2f407B99173A2b12A6DDfC2a6",
+ "opsSeen": "0x14",
+ "opsIncluded": "0x13",
+ "status": "ok"
+ }
+ ]
+}
+```
+
+#### \* debug_bundler_addUserOps
+
+Accept UserOperations into the mempool.
+Assume the given UserOperations all pass validation (without actually validating them), and accept them directly into th mempool
+
+**Parameters:**
+
+- An array of UserOperations
+
+```json=
+# Request
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "debug_bundler_addUserOps",
+ "params": [
+ [
+ { sender: "0xa...", ... },
+ { sender: "0xb...", ... }
+ ]
+ ]
+}
+
+# Response
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "ok"
+}
+```
+
+## Backwards Compatibility
+
+This ERC does not change the consensus layer, so there are no backwards compatibility issues for Ethereum as a whole. Unfortunately it is not easily compatible with pre-[ERC-4337](./eip-4337.md) accounts, because those accounts do not have a `validateUserOp` function. If the account has a function for authorizing a trusted op submitter, then this could be fixed by creating an [ERC-4337](./eip-4337.md) compatible account that re-implements the verification logic as a wrapper and setting it to be the original account's trusted op submitter.
+
+## Reference Implementation
+
+See `https://github.com/eth-infinitism/account-abstraction/tree/main/contracts`
+
+## Security Considerations
+
+The entry point contract will need to be very heavily audited and formally verified, because it will serve as a central trust point for _all_ [ERC-4337]. In total, this architecture reduces auditing and formal verification load for the ecosystem, because the amount of work that individual _accounts_ have to do becomes much smaller (they need only verify the `validateUserOp` function and its "check signature and pay fees" logic) and check that other functions are `msg.sender == ENTRY_POINT` gated (perhaps also allowing `msg.sender == self`), but it is nevertheless the case that this is done precisely by concentrating security risk in the entry point contract that needs to be verified to be very robust.
+
+Verification would need to cover two primary claims (not including claims needed to protect paymasters, and claims needed to establish p2p-level DoS resistance):
+
+- **Safety against arbitrary hijacking**: The entry point only calls an account generically if `validateUserOp` to that specific account has passed (and with `op.calldata` equal to the generic call's calldata)
+- **Safety against fee draining**: If the entry point calls `validateUserOp` and passes, it also must make the generic call with calldata equal to `op.calldata`
+
+## Copyright
+
+Copyright and related rights waived via [CC0](../LICENSE.md).
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/ERCS/erc-7562.md b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/ERCS/erc-7562.md
new file mode 100644
index 000000000..6126265cf
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/ERCS/erc-7562.md
@@ -0,0 +1,393 @@
+---
+eip: 7562
+title: Account Abstraction Validation Scope Rules
+description: A set of limitations on validation EVM code to protect Account Abstraction nodes from denial-of-service attacks through unpaid computation.
+author: Yoav Weiss (@yoavw), Dror Tirosh (@drortirosh), Alex Forshtat (@forshtat), Shahaf Nacson (@shahafn)
+discussions-to: https://ethereum-magicians.org/t/erc-7562-account-abstraction-validation-scope-rules/16683
+status: Draft
+type: Standards Track
+category: ERC
+created: 2023-09-01
+---
+
+## Abstract
+
+This document describes the rules we impose on the validation context of Account Abstraction transactions,
+such as [ERC-4337](./erc-4337.md) `UserOperation` or [RIP-7560](./rip-7560.md) (Native Account Abstraction), which are enforced off-chain by a
+block builder or a standalone bundler, and the rationale behind each one of them.
+
+## Motivation
+
+With Account-Abstraction, instead of hard-coded logic for processing a transaction (validation, gas-payment, and execution), this logic is executed by EVM code.
+The benefits for the account are countless -
+
+- abstracting the validation allows the contract to use different signature schemes, multisig configuration, custom recovery, and more.
+- abstracting gas payments allows easy onboarding by 3rd party payments, paying with tokens, cross-chain gas payments
+- abstracting execution allows batch transactions
+
+All of the above are missing from the EOA account model.
+
+However, there is one rule a transaction must follow to preserve the decentralized network: once submitted into the network (the mempool), the transaction is guaranteed to pay. This comes to prevent denial of service attacks on the network.
+
+The EOA model implicitly follows the rule: a valid transaction can't become invalid without payment by the account: e.g account balance can't be reduced (except with a higher paying transaction)
+
+This simple rule makes the network sustainable and DoS-protected: the network can't be cheaply attacked by a mass of transactions. An attack (sending a mass of transactions) is expensive, and gets more expensive as the network clogs. Legitimate users pay more, and can delay operations to avoid the cost, but the attacker pays a huge (and increasing) amount to keep the network clogged.
+
+For Account-Abstraction system we want to keep the same rule, so that attempting a DoS attack on the network should be as expensive.
+In order to do so, we add the following validation rules.
+
+For the actual interfaces of those contract-based accounts see the definitions in ERC-4337 and RIP-7560.
+
+This documentation uses the terminology "UserOperation" for a transaction created by a smart contract account, and closely follows [ERC-4337](./erc-4337.md) terminology.
+However, the rules apply to any account-abstraction framework that uses EVM code to perform transaction validation and makes a distinction between validation and execution.
+
+## Rationale
+
+All transactions initiated by EOAs have an implicit validation phase where balance, nonce, and signature are
+checked to be valid for the current state of the Ethereum blockchain.
+Once the transaction is checked to be valid by a node, only another transaction by the same EOA can modify the Ethereum
+state in a way that makes the first transaction invalid.
+
+With Account Abstraction, however, the validation can also include an arbitrary EVM code and rely on storage as well,
+which means that unrelated `UserOperations` or transactions may invalidate each other.
+
+If not addressed, this would make the job of maintaining a mempool of valid `UserOperations` and producing valid
+bundles computationally infeasible and susceptible to DoS attacks.
+
+This document describes a set of validation rules that if applied by a bundler before accepting a `UserOperation`
+into the mempool can prevent such attacks.
+
+### The high-level goal
+
+The purpose of this specification is to define a consensus between nodes (bundlers or block-builders) when processing incoming UserOperations from an external source.
+This external source for UserOperations is either an end-user node (via RPC) or another node in the p2p network.
+
+The protocol tries to detect "spam" - which are large bursts of UserOperations that cannot be included on-chain (and thus can't pay).
+The network is protected by throttling down requests from such spammer nodes.
+
+All nodes in the network must have the same definition of "spam": otherwise, if some nodes accept some type of UserOperations and propagate them while others consider them spam, those "forgiving" nodes will be considered "spammers" by the rest of the nodes, and the network effectively gets split.
+
+### The processing flow of a UserOperation
+
+- First, a UserOperation is received - either via RPC (submitted on behalf of a single application) or via the p2p protocol, from another node in the mempool.
+- The node performs validation on the UserOperation, and then adds it to its in-memory mempool, and submits it to its peers.
+- Lastly, when building a block, a node collects UserOperations from the mempool, performs a 2nd validation to make sure they are all still valid as a bundle and submits them into the next block.
+
+### The need for 2nd validation before submitting a block
+
+A normal Ethereum transaction in the mempool can be invalidated if another transaction was received with the same nonce. That other transaction had to increase the gas price in order to replace the first one, so it satisfied the rule of "must pay to get included into the mempool"
+With contract-based accounts, since the UserOperation validity may depend on mutable state, other transactions may invalidate a previously valid UserOperation, so we must check it before inclusion
+
+### Rationale of limiting opcodes:
+
+- the validation is performed off-chain, before creating a block. Some opcodes access information that is known only when creating the block.
+- using those opcodes while validating a transaction can easily create a validation rule that will succeed off-chain, but always revert on-chain, and thus cause a DoS attack.
+- a simple example is `require block.number==12345`. It can be valid when validating the UserOperation and adding it to the mempool
+ but will be invalid when attempting to include it on-chain at a later block.
+
+### Rationale for limiting storage access
+
+- We need UserOperation validations not to overlap so that a single storage change can't easily invalidate a large number of UserOperations in the mempool. By limiting UserOperations to access storage associated with the account itself, we know that we can for sure include a single UserOperation for each account in a bundle
+- (A bundler MAY include more than one UserOperation of an account in a bundle, MUST first validate them together)
+
+### Rationale of requiring a stake
+
+We want to be able to allow globally-used contracts (paymasters, factories) to use storage not associated with the account, but still prevent them from
+spamming the mempool.
+If a contract causes too many UserOperations to fail in their second validation after succeeding in their first, we can throttle its use in the mempool.
+By requiring such a contract to have a stake, we prevent a "Sybil attack", by making it expensive to create a large number of such paymasters to continue the spam attack.
+
+By following the validation rules, we can detect contracts that cause spam UserOperations, and throttle them.
+The stake comes to prevent the fast re-creation of malicious entities.
+The stake is never slashed (since it is only used for off-chain detection) but is locked for a period of time, which makes such an attack much more expensive.
+
+### Definition of the `mass invalidation attack`
+
+A possible set of actions is considered to be a `mass invalidation attack` on the network if a large number of
+`UserOperations` that did pass the initial validation and were accepted by nodes and propagated further into the
+mempool to other bundlers in the network becomes invalid and not eligible for inclusion in a block.
+
+There are 3 ways to perform such an attack:
+
+1. Submit `UserOperation`s that pass the initial validation, but later fail the re-validation
+ that is performed during the bundle creation.
+2. Submit `UserOperation`s that are valid in isolation during validation, but when bundled
+ together become invalid.
+3. Submit valid `UserOperation`s but "front-run" them by executing a state change on the
+ network that causes them to become invalid. The "front-run" in question must be economically viable.
+
+To prevent such attacks, we attempt to "sandbox" the validation code.
+We isolate the validation code from other `UserOperations`, from external changes to the storage, and
+from information about the environment such as a current block timestamp.
+
+### What is not considered a `mass invalidation attack`
+
+A `UserOperation` that fails the initial validation by a receiving node without entering its mempool is not
+considered an attack. The node is expected to apply web2 security measures and throttle requests based on API key,
+source IP address, etc.
+RPC nodes already do that to prevent being spammed with invalid transactions which also have a validation cost.
+P2P nodes already have (and should apply) a scoring mechanism to determine spammer nodes.
+
+Also, if the invalidation of `N` UserOperations from the mempool costs `N*X` with a sufficiently large `X`, it is not considered an economically viable attack.
+
+- The minimum change to cause an invalidation is a storage change (5k gas)
+- Assuming a Node can sustain processing 2000 invalid UserOps per block, the cost of a DoS attack is 10M gas per block.
+- The above value is high, but we take further measures to make such an attack more expensive.
+
+## Specification
+
+### Rule Types
+
+There are two types of rules:
+
+- **Network-wide rules** rules that MUST be applied to each UserOperation before accepting it into the local mempool and propagating it.
+ These rules include the opcode and storage rules.
+ - Failing these validation rules SHOULD drop the UserOperation
+ - Failing these validations during 2nd validation phase (before submitting a bundle) SHOULD degrade
+ the reputation of the offending entity
+ - Bundler MUST NOT propagate UserOperations that fail the validation rules, otherwise
+ it will be considered a "spammer" by other bundlers in the mempool, and get disconnected.
+
+- **Local rules**
+ These are "soft" rules, based on the reputation of entities.
+ These rules come to protect the bundler itself from spamming attacks.
+ - Bundlers SHOULD drop such UserOperations without performing validation.
+ - Bundlers SHOULD NOT propagate such UserOperations to other bundlers.
+ - Bundlers SHOULD NOT consider another bundler a "spammer" if it does.
+
+### Constants
+
+| Title | Value | Comment |
+| ------------------------------------ | --------------------------- | ------------------------------------------------------------------------------- |
+| `MIN_UNSTAKE_DELAY` | 86400 | 1 day |
+| `MIN_STAKE_VALUE` | Adjustable per chain value | Equivalent to ~$1000 in native tokens |
+| `SAME_SENDER_MEMPOOL_COUNT` | 4 | |
+| `SAME_UNSTAKED_ENTITY_MEMPOOL_COUNT` | 10 | |
+| `THROTTLED_ENTITY_MEMPOOL_COUNT` | 4 | Number of `UserOperations` with a throttled entity that can stay in the mempool |
+| `THROTTLED_ENTITY_LIVE_BLOCKS` | 10 | Number of blocks a `UserOperations` with a throttled entity can stay in mempool |
+| `THROTTLED_ENTITY_BUNDLE_COUNT` | 4 | |
+| `MIN_INCLUSION_RATE_DENOMINATOR` | 100 (client) \ 10 (bundler) | |
+| `THROTTLING_SLACK` | 10 | |
+| `BAN_SLACK` | 50 | |
+| `BAN_OPS_SEEN_PENALTY` | 10000 | |
+| `MAX_OPS_ALLOWED_UNSTAKED_ENTITY` | 10000 |
+
+### Validation Rules
+
+### **Definitions**:
+
+1. **Validation Phases**: there are up to 3 phases of validation
+ 1. smart account deployment
+ 2. smart account validation
+ 3. paymaster validation.
+2. **Entity**: a contract that is explicitly specified by the `UserOperation`.
+ Includes the `factory`, `paymaster`, `aggregator`, and staked `account`, as discussed below. \
+ Each "validation phase" is attributed to a single entity. \
+ Entity contracts must have non-empty code on-chain.
+3. **Canonical Mempool**: The rules defined in this document apply to the main mempool shared by all bundlers on the network.
+4. **Staked Entity:** an entity that has a locked stake of at least `MIN_STAKE_VALUE`
+ and an unstake delay of at least `MIN_UNSTAKE_DELAY`.
+5. **Associated storage:** a storage slot of any smart contract is considered to be "associated" with address `A` if:
+ 1. The slot value is `A`
+ 2. The slot value was calculated as `keccak(A||x)+n`, where `x` is a `bytes32` value, and `n` is a value in the range 0..128
+6. **Using an address**: accessing the code of a given address in any way.
+ This can be done by executing `*CALL` or `EXTCODE*` opcodes for a given address.
+
+### Reputation Definitions
+
+1. **opsSeen**: a per-entity counter of how many times a unique valid `UserOperation` referencing this entity
+ was received by this bundler.
+ This includes `UserOperation` received via incoming RPC calls or through a P2P mempool protocol.
+
+2. **opsIncluded**: a per-entity counter of how many times a unique valid `UserOperation` referencing this entity
+ appeared in an actual included `UserOperation`. \
+ Calculation of this value is based on UserOperationEvents and is only counted for `UserOperations` that were
+ previously counted as `opsSeen` by this bundler.
+3. Both values are updated every hour as `value = value * 23 // 24` \
+ Effectively, the value is reduced to 1% after 4 days.
+4. **inclusionRate**: Relation of `opsIncluded` to `opsSeen`
+
+### Reputation Calculation
+
+We define a value `max_seen = opsSeen // MIN_INCLUSION_RATE_DENOMINATOR`.
+
+The reputation state of each entity is determined as follows:
+
+1. **BANNED**: `max_seen > opsIncluded + BAN_SLACK`
+2. **THROTTLED**: `max_seen > opsIncluded + THROTTLING_SLACK`
+3. **OK**: otherwise
+
+Note that new entities start with an `OK` reputation.
+
+To help make sense of these params, note that a malicious paymaster can at most cause the network (only the p2p network, not the blockchain) to process `BAN_SLACK * MIN_INCLUSION_RATE_DENOMINATOR / 24` non-paying ops per hour.
+
+### Running the Validation Rules
+
+1. A block builder or a bundler should perform a full validation before accepting a `UserOperation` into its mempool.
+2. During the validation phase, the bundler should trace the execution and apply all the rules defined in this document.
+3. A bundler should also perform a full validation of the entire bundle before submission.
+4. The validation rules prevent an unstaked entity from detecting the bundle validation.
+ However, a malicious staked entity can detect that it is running in a bundle validation and cause a revert.
+5. The failed `UserOperation` should be dropped from the bundle.
+6. The staked entity that caused a revert violated the Account Abstraction rules and should be marked as `THROTTLED`.
+
+### Mempool Validation Rules
+
+1. A `UserOperation` is broadcast over the P2P protocol with the following information:
+ 1. The `UserOperation` itself
+ 2. The blockhash this `UserOperation` was originally verified against.
+2. Once a `UserOperation` is received from another bundler it should be verified locally by a receiving bundler.
+3. A received `UserOperation` may fail any of the reasonable static checks, such as: \
+ invalid format, values below minimum, submitted with a blockhash that isn't recent, etc. \
+ In this case, the bundler should drop this particular `UserOperation` but keep the connection.
+4. The bundler should check the `UserOperation` against the nonces of last-included bundles. \
+ Silently drop `UserOperations` with `nonce` that was recently included.
+ This invalidation is likely attributable to a network race condition and should not cause a reputation change.
+5. If a received `UserOperation` fails against the current block:
+ 1. Retry the validation against the block the `UserOperation` was originally verified against.
+ 2. If it succeeds, silently drop the `UserOperation` and keep the connection.
+ 3. If it fails, mark the sender as a "spammer"
+
+### Opcode Rules
+
+- Block access from opcodes that access information outside of storage and code (aka "environment").
+ - **[OP-011]** Blocked Opcodes:
+ - `BALANCE` (`0x31`)
+ - `ORIGIN` (`0x32`)
+ - `GASPRICE` (`0x3A`)
+ - `BLOCKHASH` (`0x40`)
+ - `COINBASE` (`0x41`)
+ - `TIMESTAMP` (`0x42`)
+ - `NUMBER` (`0x43`)
+ - `PREVRANDAO`/`DIFFICULTY` (`0x44`)
+ - `GASLIMIT` (`0x45`)
+ - `SELFBALANCE` (`0x47`)
+ - `BASEFEE` (`0x48`)
+ - `GAS` (`0x5A`)
+ - `CREATE` (`0xF0`)
+ - `INVALID` (`0xFE`)
+ - `SELFDESTRUCT` (`0xFF`)
+ - **[OP-012]** `GAS `opcode is allowed, but only if followed immediately by `*CALL` instructions.\
+ This is a common way to pass all remaining gas to an external call, and it means that the actual value is
+ consumed from the stack immediately and cannot be accessed by any other opcode.
+ - **[OP-13]** any "unassigned" opcode.
+- **[OP-020]** Revert on "out of gas" is forbidden as it can "leak" the gas limit or the current call stack depth.
+- Contract creation:
+ - **[OP-031]** `CREATE2` is allowed exactly once in the deployment phase and must deploy code for the "sender" address.
+- Access to an address without a deployed code is forbidden:
+ - **[OP-041]** For `EXTCODE*` and `*CALL` opcodes.
+ - **[OP-042]** Exception: access to the "sender" address is allowed.
+ This is only possible in `factory` code during the deployment phase.
+- Allowed access to the `EntryPoint` address:
+ - **[OP-051]** May call `EXTCODESIZE ISZERO`\
+ This pattern is used to check destination has a code before the `depositTo` function is called.
+ - **[OP-052]** May call `depositTo(sender)` with any value from either the `sender` or `factory`.
+ - **[OP-053]** May call the fallback function from the `sender` with any value.
+ - **[OP-054]** Any other access to the `EntryPoint` is forbidden.
+- `*CALL` opcodes:
+ - **[OP-061]** `CALL` with `value` is forbidden. The only exception is a call to the `EntryPoint` described above.
+ - **[OP-062]** Precompiles:
+ - Only allow known accepted precompiles on the network, that do not access anything in the blockchain state or environment.
+ - The core precompiles 0x1 .. 0x9
+ - The [RIP-7212](./rip-7212.md) sec256r1 precompile, on networks that accepted it.
+- **[OP-070]** Transient Storage slots defined in [EIP-1153](./eip-1153) and accessed using `TLOAD` (`0x5c`) and `TSTORE` (`0x5d`) opcodes
+ are treated exactly like persistent storage (SLOAD/SSTORE).
+
+### Code Rules
+
+- **[COD-010]** Between the first and the second validations, the `EXTCODEHASH` value of any visited address,
+ entity, or referenced library, may not be changed.\
+ If the code is modified, the UserOperation is considered invalid.
+
+### Storage Rules
+
+The permanent storage access with `SLOAD` and `SSTORE` instructions within each phase is limited as follows:
+
+- **[STO-010]** Access to the "account" storage is always allowed.
+- Access to associated storage of the account in an external (non-entity) contract is allowed if either:
+ - **[STO-021]** The account already exists.
+ - **[STO-022]** There is an `initCode` and the `factory` contract is staked.
+- If the entity (`paymaster`, `factory`) is staked, then it is also allowed:
+ - **[STO-031]** Access the entity's own storage.
+ - **[STO-032]** Read/Write Access to storage slots that are associated with the entity, in any non-entity contract.
+ - **[STO-033]** Read-only access to any storage in non-entity contract.
+
+### Local Rules
+
+Local storage rules protect the bundler against denial of service at the time of bundling. They do not affect mempool propagation and cannot cause a bundler to be marked as a "spammer".
+
+- **[STO-040]** `UserOperation` may not use an entity address (`factory`/`paymaster`/`aggregator`) that is used as an "account" in another `UserOperation` in the mempool. \
+ This means that `Paymaster` and `Factory` contracts cannot practically be an "account" contract as well.
+- **[STO-041]** `UserOperation` may not use associated storage (of either its account or from staked entity) in a contract that is a "sender" of another UserOperation in the mempool.
+
+### General Reputation Rules
+
+The following reputation rules apply for all staked entities, and for unstaked paymasters. All rules apply to all of these entities unless specified otherwise.
+
+- **[GREP-010]** A `BANNED` address is not allowed into the mempool.\
+ Also, all existing `UserOperations` referencing this address are removed from the mempool.
+- **[GREP-020]** A `THROTTLED` address is limited to:
+ - `THROTTLED_ENTITY_MEMPOOL_COUNT` entries in the mempool.
+ - `THROTTLED_ENTITY_BUNDLE_COUNT` `UserOperations` in a bundle.
+ - Can remain in the mempool only for `THROTTLED_ENTITY_LIVE_BLOCKS`.
+- **[GREP-040]** If an entity fails the bundle creation after passing second validation, its `opsSeen` set to `BAN_OPS_SEEN_PENALTY`, and `opsIncluded` to zero, causing it to be `BANNED`.
+
+### Staked Entities Reputation Rules
+
+- **[SREP-010]** The "canonical mempool" defines a staked entity if it has `MIN_STAKE_VALUE` and unstake delay of `MIN_UNSTAKE_DELAY`
+- **[SREP-020]** An `OK` staked entity is unlimited by the reputation rule.
+ - Allowed in unlimited numbers in the mempool.
+ - Allowed in unlimited numbers in a bundle.
+
+### Entity-specific Rules
+
+- **[EREP-010]** For each `paymaster`, the mempool must maintain the total gas `UserOperations` using this `paymaster` may consume.
+ - Do not add a `UserOperation` to the mempool if the maximum total gas cost, including the new `UserOperation`, is above the deposit of the `paymaster` at the current gas price.
+- **[EREP-015]** A `paymaster` should not have its opsSeen incremented on failure of factory or account
+ - When running 2nd validation (before inclusion in a bundle), if a UserOperation fails because of factory or account error (either a FailOp revert or validation rule), then the paymaster's opsSeen valid is decremented by 1.
+- **[EREP-020]** A staked factory is "accountable" for account breaking the rules. \
+ That is, if the `validateUserOp()` is rejected for any reason in a `UserOperation` that has an `initCode`, it is treated as if the factory caused this failure, and thus this affects its reputation.
+- **[EREP-030]** A Staked Account is accountable for failures in other entities (`paymaster`, `aggregator`) even if they are staked.
+- **[EREP-040]** An `aggregator` must be staked, regardless of storage usage.
+
+### Unstaked Paymasters Reputation Rules
+
+- Definitions:
+ - **`opsSeen`, `opsIncluded`, and reputation calculation** are defined above.
+ - `UnstakedReputation` of an entity determines the maximum number of entries using this entity allowed in the mempool.
+ - `opsAllowed` is a reputation-based calculation for an unstaked entity, representing how many `UserOperations` it is allowed to have in the mempool.
+ - Rules:
+ - **[UREP-010]** An unstaked sender is only allowed to have `SAME_SENDER_MEMPOOL_COUNT` `UserOperation`s in the mempool. A staked sender is only limited by the SREP rules.
+ - **[UREP-020]** For an unstaked paymaster only that is not throttled/banned: \
+ `opsAllowed = SAME_UNSTAKED_ENTITY_MEMPOOL_COUNT + inclusionRate * min(opsIncluded, MAX_OPS_ALLOWED_UNSTAKED_ENTITY)`.
+ - This is a default of `SAME_UNSTAKED_ENTITY_MEMPOOL_COUNT` for new entity
+
+### Alt-mempools Rules
+
+Alternate mempool is an agreed-upon rule that the bundlers may opt into, in addition to the canonical mempool
+The alt-mempool "topic" is a unique identifier. By convention, this is the IPFS hash of the document describing (in clear test and YAML file) the specifics of this alt mempool
+
+- **[ALT-010]** The bundler listens to the alt-mempool "topic" over the P2P protocol
+- **[ALT-020]** The alt mempool rules MUST be checked only when a canonical rule is violated
+ - That is, if validation follows the canonical rules above, it is not considered part of an alt-mempool.
+- **[ALT-021]** Such a `UserOperation` (that violates the canonical rules) is checked against all the "alternate mempools", and is considered part of all those alt-mempools
+- **[ALT-030]** Bundlers SHOULD forward `UserOperations` to other bundlers only once, regardless of how many (shared) alt-mempools they have. \
+ The receiving bundler validates the `UserOperations`, and based on the above rules (and subscribed alt-mempools) decides which alt-mempools to propagate it to.
+- **[ALT-040]** opsInclude and opsSeen of entities are kept per alt-mempool. That is, an entity can be considered throttled (or banned) in one mempool, while still active on another.
+
+### Alt-mempool Reputation
+
+Alt-mempools are served by the same bundlers participating in the canonical mempool, but change the rules and may introduce denial-of-service attack vectors. To prevent them from taking the canonical mempool or other alt mempools down with them, a reputation is managed for each. An alt mempool that causes too many invalidations gets throttled. This limits the scope of the attack and lets the bundler continue doing its work for other mempools.
+
+- **[AREP-010]** each alt-mempool manages "opsSeen" and "opsIncluded", much like entities. The opsSeen is incremented after `UserOperation` initial validation, where it is considered part of this mempool.
+ The "opsIncluded" is incremented after this UserOperation is included on-chain (either by this bundler, or another)
+- **[AREP-020]** the alt-mempool becomes THROTTLED based on the [Reputation Calculation](#reputation-calculation)
+
+## Security Considerations
+
+This document describes the security considerations bundlers must take to protect themselves (and the entire mempool network)
+from denial-of-service attacks.
+
+## Copyright
+
+Copyright and related rights waived via [CC0](../LICENSE.md).
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/bundle-seq-pm.svg b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/bundle-seq-pm.svg
new file mode 100644
index 000000000..67befce8e
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/bundle-seq-pm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/bundle-seq.svg b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/bundle-seq.svg
new file mode 100644
index 000000000..a637d705e
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/bundle-seq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/image1.png b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/image1.png
new file mode 100644
index 000000000..ced8ea57d
Binary files /dev/null and b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/image1.png differ
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/image2.png b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/image2.png
new file mode 100644
index 000000000..6d0c6f71a
Binary files /dev/null and b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/image2.png differ
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/0-init-gas-checker.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/0-init-gas-checker.ts
new file mode 100644
index 000000000..78d6b7fc7
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/0-init-gas-checker.ts
@@ -0,0 +1,12 @@
+import { GasCheckCollector, GasChecker } from './GasChecker'
+
+describe('gas calculations', function () {
+ this.timeout(60000)
+ const g = new GasChecker()
+
+ it('warmup', async function () {
+ await GasCheckCollector.init()
+ // dummy run - first run is slower.
+ await g.runTest({ title: 'simple', count: 1, diffLastGas: false })
+ })
+})
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/1-simple-wallet.gas.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/1-simple-wallet.gas.ts
new file mode 100644
index 000000000..0943d1f0d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/1-simple-wallet.gas.ts
@@ -0,0 +1,17 @@
+import { GasChecker } from './GasChecker'
+
+context('simple account', function () {
+ this.timeout(60000)
+ const g = new GasChecker()
+
+ it('simple 1', async function () {
+ await g.addTestRow({ title: 'simple', count: 1, diffLastGas: false })
+ await g.addTestRow({ title: 'simple - diff from previous', count: 2, diffLastGas: true })
+ })
+
+ it('simple 10', async function () {
+ if (g.skipLong()) this.skip()
+ await g.addTestRow({ title: 'simple', count: 10, diffLastGas: false })
+ await g.addTestRow({ title: 'simple - diff from previous', count: 11, diffLastGas: true })
+ })
+})
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/2-paymaster.gas.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/2-paymaster.gas.ts
new file mode 100644
index 000000000..ec95f9ad0
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/2-paymaster.gas.ts
@@ -0,0 +1,59 @@
+import { parseEther } from 'ethers/lib/utils'
+import { TestPaymasterAcceptAll__factory } from '../typechain'
+import { ethers } from 'hardhat'
+import { GasChecker } from './GasChecker'
+import { Create2Factory } from '../src/Create2Factory'
+import { hexValue } from '@ethersproject/bytes'
+
+const ethersSigner = ethers.provider.getSigner()
+
+context('Minimal Paymaster', function () {
+ this.timeout(60000)
+ const g = new GasChecker()
+
+ let paymasterAddress: string
+ before(async () => {
+ const paymasterInit = hexValue(
+ new TestPaymasterAcceptAll__factory(ethersSigner).getDeployTransaction(g.entryPoint().address)
+ .data!
+ )
+ paymasterAddress = await new Create2Factory(ethers.provider, ethersSigner).deploy(
+ paymasterInit,
+ 0
+ )
+ const paymaster = TestPaymasterAcceptAll__factory.connect(paymasterAddress, ethersSigner)
+ await paymaster.addStake(1, { value: 1 })
+ await g.entryPoint().depositTo(paymaster.address, { value: parseEther('10') })
+ })
+ it('simple paymaster', async function () {
+ await g.addTestRow({
+ title: 'simple paymaster',
+ count: 1,
+ paymaster: paymasterAddress,
+ diffLastGas: false,
+ })
+ await g.addTestRow({
+ title: 'simple paymaster with diff',
+ count: 2,
+ paymaster: paymasterAddress,
+ diffLastGas: true,
+ })
+ })
+
+ it('simple paymaster 10', async function () {
+ if (g.skipLong()) this.skip()
+
+ await g.addTestRow({
+ title: 'simple paymaster',
+ count: 10,
+ paymaster: paymasterAddress,
+ diffLastGas: false,
+ })
+ await g.addTestRow({
+ title: 'simple paymaster with diff',
+ count: 11,
+ paymaster: paymasterAddress,
+ diffLastGas: true,
+ })
+ })
+})
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/3-huge-tx-gas.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/3-huge-tx-gas.ts
new file mode 100644
index 000000000..2983473c5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/3-huge-tx-gas.ts
@@ -0,0 +1,27 @@
+import { DefaultGasTestInfo, GasChecker } from './GasChecker'
+
+context('huge tx - 5k', function () {
+ this.timeout(60000)
+ const huge = DefaultGasTestInfo.destCallData!.padEnd(10240, 'f')
+ const g = new GasChecker()
+
+ it('big tx 5k', async () => {
+ await g.addTestRow({ title: 'big tx 5k', count: 1, destCallData: huge, diffLastGas: false })
+ await g.addTestRow({
+ title: 'big tx - diff from previous',
+ count: 2,
+ destCallData: huge,
+ diffLastGas: true,
+ })
+ })
+ it('big tx 10', async function () {
+ if (g.skipLong()) this.skip()
+ await g.addTestRow({ title: 'big tx 5k', count: 10, destCallData: huge, diffLastGas: false })
+ await g.addTestRow({
+ title: 'big tx - diff from previous',
+ count: 11,
+ destCallData: huge,
+ diffLastGas: true,
+ })
+ })
+})
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/4-paymaster-postop.gas.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/4-paymaster-postop.gas.ts
new file mode 100644
index 000000000..d33e38506
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/4-paymaster-postop.gas.ts
@@ -0,0 +1,62 @@
+import { parseEther } from 'ethers/lib/utils'
+import { TestPaymasterWithPostOp__factory } from '../typechain'
+import { ethers } from 'hardhat'
+import { GasChecker } from './GasChecker'
+import { Create2Factory } from '../src/Create2Factory'
+import { hexValue } from '@ethersproject/bytes'
+
+const ethersSigner = ethers.provider.getSigner()
+
+context('Paymaster with PostOp', function () {
+ this.timeout(60000)
+ const g = new GasChecker()
+
+ let paymasterAddress: string
+
+ before(async () => {
+ const paymasterInit = hexValue(
+ new TestPaymasterWithPostOp__factory(ethersSigner).getDeployTransaction(
+ g.entryPoint().address
+ ).data!
+ )
+ paymasterAddress = await new Create2Factory(ethers.provider, ethersSigner).deploy(
+ paymasterInit,
+ 0
+ )
+ const paymaster = TestPaymasterWithPostOp__factory.connect(paymasterAddress, ethersSigner)
+ await paymaster.addStake(1, { value: 1 })
+ await g.entryPoint().depositTo(paymaster.address, { value: parseEther('10') })
+ })
+
+ it('paymaster with PostOp', async function () {
+ await g.addTestRow({
+ title: 'paymaster+postOp',
+ count: 1,
+ paymaster: paymasterAddress,
+ diffLastGas: false,
+ })
+ await g.addTestRow({
+ title: 'paymaster+postOp with diff',
+ count: 2,
+ paymaster: paymasterAddress,
+ diffLastGas: true,
+ })
+ })
+
+ it('paymaster with postOp 10', async function () {
+ if (g.skipLong()) this.skip()
+
+ await g.addTestRow({
+ title: 'paymaster+postOp',
+ count: 10,
+ paymaster: paymasterAddress,
+ diffLastGas: false,
+ })
+ await g.addTestRow({
+ title: 'paymaster+postOp with diff',
+ count: 11,
+ paymaster: paymasterAddress,
+ diffLastGas: true,
+ })
+ })
+})
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/5-token-paymaster.gas.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/5-token-paymaster.gas.ts
new file mode 100644
index 000000000..985d1ac97
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/5-token-paymaster.gas.ts
@@ -0,0 +1,159 @@
+import { parseEther } from 'ethers/lib/utils'
+import {
+ TestERC20__factory,
+ TestOracle2__factory,
+ TestUniswap__factory,
+ TestWrappedNativeToken__factory,
+ TokenPaymaster,
+ TokenPaymaster__factory,
+} from '../typechain'
+import { ethers } from 'hardhat'
+import { GasCheckCollector, GasChecker } from './GasChecker'
+import { Create2Factory } from '../src/Create2Factory'
+import { hexValue } from '@ethersproject/bytes'
+import {
+ OracleHelper as OracleHelperNamespace,
+ UniswapHelper as UniswapHelperNamespace,
+} from '../typechain/contracts/samples/TokenPaymaster'
+import { BigNumber } from 'ethers'
+import { createAccountOwner } from '../test/testutils'
+// const ethersSigner = ethers.provider.getSigner()
+
+context('Token Paymaster', function () {
+ this.timeout(60000)
+ const g = new GasChecker()
+
+ let paymasterAddress: string
+ before(async () => {
+ await GasCheckCollector.init()
+ const globalSigner = ethers.provider.getSigner()
+ const create2Factory = new Create2Factory(ethers.provider, globalSigner)
+
+ const ethersSigner = createAccountOwner()
+ await globalSigner.sendTransaction({ to: ethersSigner.getAddress(), value: parseEther('10') })
+
+ const minEntryPointBalance = (1e17).toString()
+ const initialPriceToken = 100000000 // USD per TOK
+ const initialPriceEther = 500000000 // USD per ETH
+ const priceDenominator = BigNumber.from(10).pow(26)
+
+ const tokenInit = await new TestERC20__factory(ethersSigner).getDeployTransaction(6)
+ const tokenAddress = await create2Factory.deploy(tokenInit, 0)
+ const token = TestERC20__factory.connect(tokenAddress, ethersSigner)
+
+ const wethInit = await new TestWrappedNativeToken__factory(ethersSigner).getDeployTransaction()
+ const wethAddress = await create2Factory.deploy(wethInit, 0)
+ const testUniswapInit = await new TestUniswap__factory(ethersSigner).getDeployTransaction(
+ wethAddress
+ )
+ const testUniswapAddress = await create2Factory.deploy(testUniswapInit, 0)
+
+ const tokenPaymasterConfig: TokenPaymaster.TokenPaymasterConfigStruct = {
+ priceMaxAge: 86400,
+ refundPostopCost: 40000,
+ minEntryPointBalance,
+ priceMarkup: priceDenominator.mul(15).div(10), // +50%
+ }
+
+ const nativeAssetOracleInit = await new TestOracle2__factory(ethersSigner).getDeployTransaction(
+ initialPriceEther,
+ 8
+ )
+ const nativeAssetOracleAddress = await create2Factory.deploy(
+ nativeAssetOracleInit,
+ 0,
+ 10_000_000
+ )
+ const tokenOracleInit = await new TestOracle2__factory(ethersSigner).getDeployTransaction(
+ initialPriceToken,
+ 8
+ )
+ const tokenOracleAddress = await create2Factory.deploy(tokenOracleInit, 0, 10_000_000)
+
+ const oracleHelperConfig: OracleHelperNamespace.OracleHelperConfigStruct = {
+ cacheTimeToLive: 100000000,
+ maxOracleRoundAge: 0,
+ nativeOracle: nativeAssetOracleAddress,
+ nativeOracleReverse: false,
+ priceUpdateThreshold: priceDenominator.mul(2).div(10), // +20%
+ tokenOracle: tokenOracleAddress,
+ tokenOracleReverse: false,
+ tokenToNativeOracle: false,
+ }
+
+ const uniswapHelperConfig: UniswapHelperNamespace.UniswapHelperConfigStruct = {
+ minSwapAmount: 1,
+ slippage: 5,
+ uniswapPoolFee: 3,
+ }
+
+ const owner = await ethersSigner.getAddress()
+
+ const paymasterInit = hexValue(
+ new TokenPaymaster__factory(ethersSigner).getDeployTransaction(
+ tokenAddress,
+ g.entryPoint().address,
+ wethAddress,
+ testUniswapAddress,
+ tokenPaymasterConfig,
+ oracleHelperConfig,
+ uniswapHelperConfig,
+ owner
+ ).data!
+ )
+ paymasterAddress = await create2Factory.deploy(paymasterInit, 0)
+ const paymaster = TokenPaymaster__factory.connect(paymasterAddress, ethersSigner)
+ await paymaster.addStake(1, { value: 1 })
+ await g.entryPoint().depositTo(paymaster.address, { value: parseEther('10') })
+ await paymaster.updateCachedPrice(true)
+ await g.createAccounts1(11)
+ await token.sudoMint(await ethersSigner.getAddress(), parseEther('20'))
+ await token.transfer(paymaster.address, parseEther('0.1'))
+ for (const address of g.createdAccounts) {
+ await token.transfer(address, parseEther('1'))
+ await token.sudoApprove(address, paymaster.address, ethers.constants.MaxUint256)
+ }
+
+ console.log('==addresses:', {
+ ethersSigner: await ethersSigner.getAddress(),
+ paymasterAddress,
+ nativeAssetOracleAddress,
+ tokenOracleAddress,
+ tokenAddress,
+ owner,
+ createdAccounts: g.createdAccounts,
+ })
+ })
+
+ it('token paymaster', async function () {
+ await g.addTestRow({
+ title: 'token paymaster',
+ count: 1,
+ paymaster: paymasterAddress,
+ diffLastGas: false,
+ })
+ await g.addTestRow({
+ title: 'token paymaster with diff',
+ count: 2,
+ paymaster: paymasterAddress,
+ diffLastGas: true,
+ })
+ })
+
+ it('token paymaster 10', async function () {
+ if (g.skipLong()) this.skip()
+
+ await g.addTestRow({
+ title: 'token paymaster',
+ count: 10,
+ paymaster: paymasterAddress,
+ diffLastGas: false,
+ })
+ await g.addTestRow({
+ title: 'token paymaster with diff',
+ count: 11,
+ paymaster: paymasterAddress,
+ diffLastGas: true,
+ })
+ })
+})
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/GasChecker.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/GasChecker.ts
new file mode 100644
index 000000000..8a30d215a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/GasChecker.ts
@@ -0,0 +1,459 @@
+// calculate gas usage of different bundle sizes
+import '../test/aa.init'
+import { defaultAbiCoder, hexConcat, parseEther } from 'ethers/lib/utils'
+import {
+ AddressZero,
+ checkForGeth,
+ createAddress,
+ createAccountOwner,
+ deployEntryPoint,
+ decodeRevertReason,
+} from '../test/testutils'
+import {
+ EntryPoint,
+ EntryPoint__factory,
+ SimpleAccountFactory,
+ SimpleAccountFactory__factory,
+ SimpleAccount__factory,
+} from '../typechain'
+import { BigNumberish, Wallet } from 'ethers'
+import hre from 'hardhat'
+import { fillSignAndPack, fillUserOp, packUserOp, signUserOp } from '../test/UserOp'
+import { TransactionReceipt } from '@ethersproject/abstract-provider'
+import { table, TableUserConfig } from 'table'
+import { Create2Factory } from '../src/Create2Factory'
+import * as fs from 'fs'
+import { SimpleAccountInterface } from '../typechain/contracts/samples/SimpleAccount'
+import { PackedUserOperation } from '../test/UserOperation'
+import { expect } from 'chai'
+
+const gasCheckerLogFile = './reports/gas-checker.txt'
+
+const ethers = hre.ethers
+const provider = hre.ethers.provider
+let ethersSigner = provider.getSigner()
+let lastGasUsed: number
+
+const minDepositOrBalance = parseEther('0.1')
+
+const getBalance = hre.ethers.provider.getBalance
+
+function range(n: number): number[] {
+ return Array(n)
+ .fill(0)
+ .map((val, index) => index)
+}
+
+interface GasTestInfo {
+ title: string
+ diffLastGas: boolean
+ paymaster: string
+ count: number
+ // address, or 'random' or 'self' (for account itself)
+ dest: string
+ destValue: BigNumberish
+ destCallData: string
+ beneficiary: string
+ gasPrice: number
+}
+
+export const DefaultGasTestInfo: Partial = {
+ dest: 'self', // destination is the account itself.
+ destValue: parseEther('0'),
+ destCallData: '0xb0d691fe', // entryPoint()
+ gasPrice: 10e9,
+}
+
+interface GasTestResult {
+ title: string
+ count: number
+ gasUsed: number // actual gas used
+ accountEst: number // estimateGas of the inner transaction (from EP to account)
+ gasDiff?: number // different from last test's gas used
+ receipt?: TransactionReceipt
+}
+
+/**
+ * singleton contract used by all GasChecker modules ("tests")
+ * init() static method -
+ * - create the singleton the first time (or return its existing instance)
+ * run
+ */
+
+// gas estimate of the "execFromSingleton" methods
+// we assume a given call signature has the same gas usage
+// (TODO: the estimate also depends on contract code. for test purposes, assume each contract implementation has different method signature)
+// at the end of the checks, we report the gas usage of all those method calls
+const gasEstimatePerExec: { [key: string]: { title: string; accountEst: number } } = {}
+
+/**
+ * helper contract to generate gas test.
+ * see runTest() method for "test template" info
+ * override for different account implementation:
+ * - accountInitCode() - the constructor code
+ * - accountExec() the account execution method.
+ */
+export class GasChecker {
+ accounts: { [account: string]: Wallet } = {}
+
+ accountOwner: Wallet
+
+ accountInterface: SimpleAccountInterface
+
+ constructor() {
+ this.accountOwner = createAccountOwner()
+ this.accountInterface = SimpleAccount__factory.createInterface()
+ void GasCheckCollector.init()
+ }
+
+ // generate the "exec" calldata for this account
+ accountExec(dest: string, value: BigNumberish, data: string): string {
+ return this.accountInterface.encodeFunctionData('execute', [dest, value, data])
+ }
+
+ // generate the account "creation code"
+ accountInitCode(factory: SimpleAccountFactory, salt: BigNumberish): string {
+ return hexConcat([
+ factory.address,
+ factory.interface.encodeFunctionData('createAccount', [this.accountOwner.address, salt]),
+ ])
+ }
+
+ createdAccounts = new Set()
+
+ /**
+ * create accounts up to this counter.
+ * make sure they all have balance.
+ * do nothing for account already created
+ * @param count
+ */
+ async createAccounts1(count: number): Promise {
+ const create2Factory = new Create2Factory(this.entryPoint().provider)
+ const factoryAddress = await create2Factory.deploy(
+ hexConcat([
+ SimpleAccountFactory__factory.bytecode,
+ defaultAbiCoder.encode(['address'], [this.entryPoint().address]),
+ ]),
+ 0,
+ 2885201
+ )
+ console.log('factaddr', factoryAddress)
+ const fact = SimpleAccountFactory__factory.connect(factoryAddress, ethersSigner)
+ // create accounts
+ const creationOps: PackedUserOperation[] = []
+ for (const n of range(count)) {
+ const salt = n
+ // const initCode = this.accountInitCode(fact, salt)
+
+ const addr = await fact.getAddress(this.accountOwner.address, salt)
+
+ if (!this.createdAccounts.has(addr)) {
+ // explicit call to fillUseROp with no "entryPoint", to make sure we manually fill everything and
+ // not attempt to fill from blockchain.
+ const op = signUserOp(
+ await fillUserOp({
+ sender: addr,
+ nonce: 0,
+ callGasLimit: 30000,
+ verificationGasLimit: 1000000,
+ // paymasterAndData: paymaster,
+ preVerificationGas: 1,
+ maxFeePerGas: 0,
+ }),
+ this.accountOwner,
+ this.entryPoint().address,
+ await provider.getNetwork().then((net) => net.chainId)
+ )
+ creationOps.push(packUserOp(op))
+ this.createdAccounts.add(addr)
+ }
+
+ this.accounts[addr] = this.accountOwner
+ // deploy if not already deployed.
+ await fact.createAccount(this.accountOwner.address, salt)
+ const accountBalance = await GasCheckCollector.inst.entryPoint.balanceOf(addr)
+ if (accountBalance.lte(minDepositOrBalance)) {
+ await GasCheckCollector.inst.entryPoint.depositTo(addr, {
+ value: minDepositOrBalance.mul(5),
+ })
+ }
+ }
+ await this.entryPoint().handleOps(creationOps, ethersSigner.getAddress())
+ }
+
+ /**
+ * helper: run a test scenario, and add a table row
+ * @param params - test parameters. missing values filled in from DefaultGasTestInfo
+ * note that 2 important params are methods: accountExec() and accountInitCode()
+ */
+ async addTestRow(params: Partial): Promise {
+ await GasCheckCollector.init()
+ GasCheckCollector.inst.addRow(await this.runTest(params))
+ }
+
+ /**
+ * run a single test scenario
+ * @param params - test parameters. missing values filled in from DefaultGasTestInfo
+ * note that 2 important params are methods: accountExec() and accountInitCode()
+ */
+ async runTest(params: Partial): Promise {
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
+ const info: GasTestInfo = { ...DefaultGasTestInfo, ...params } as GasTestInfo
+
+ console.debug('== running test count=', info.count)
+
+ // fill accounts up to this code.
+ await this.createAccounts1(info.count)
+
+ let accountEst: number = 0
+ const userOps = await Promise.all(
+ range(info.count)
+ .map((index) => Object.entries(this.accounts)[index])
+ .map(async ([account, accountOwner]) => {
+ const paymaster = info.paymaster
+
+ let { dest, destValue, destCallData } = info
+ if (dest === 'self') {
+ dest = account
+ } else if (dest === 'random') {
+ dest = createAddress()
+ const destBalance = await getBalance(dest)
+ if (destBalance.eq(0)) {
+ console.log('dest replenish', dest)
+ await ethersSigner.sendTransaction({ to: dest, value: 1 })
+ }
+ }
+ const accountExecFromEntryPoint = this.accountExec(dest, destValue, destCallData)
+
+ // remove the "dest" from the key to the saved estimations
+ // so we have a single estimation per method.
+ const estimateGasKey = this.accountExec(AddressZero, destValue, destCallData)
+
+ let est = gasEstimatePerExec[estimateGasKey]
+ // technically, each UserOp needs estimate - but we know they are all the same for each test.
+ if (est == null) {
+ const accountEst = (
+ await ethers.provider.estimateGas({
+ from: GasCheckCollector.inst.entryPoint.address,
+ to: account,
+ data: accountExecFromEntryPoint,
+ })
+ ).toNumber()
+ est = gasEstimatePerExec[estimateGasKey] = { accountEst, title: info.title }
+ }
+ // console.debug('== account est=', accountEst.toString())
+ accountEst = est.accountEst
+ const op = await fillSignAndPack(
+ {
+ sender: account,
+ callData: accountExecFromEntryPoint,
+ maxPriorityFeePerGas: info.gasPrice,
+ maxFeePerGas: info.gasPrice,
+ callGasLimit: accountEst,
+ verificationGasLimit: 1000000,
+ paymaster: paymaster,
+ paymasterVerificationGasLimit: 50000,
+ paymasterPostOpGasLimit: 50000,
+ preVerificationGas: 1,
+ },
+ accountOwner,
+ GasCheckCollector.inst.entryPoint
+ )
+ // const packed = packUserOp(op, false)
+ // console.log('== packed cost=', callDataCost(packed), packed)
+ return op
+ })
+ )
+
+ const txdata = GasCheckCollector.inst.entryPoint.interface.encodeFunctionData('handleOps', [
+ userOps,
+ info.beneficiary,
+ ])
+ console.log('=== encoded data=', txdata.length)
+ const gasEst = await GasCheckCollector.inst.entryPoint.estimateGas
+ .handleOps(userOps, info.beneficiary, {})
+ .catch((e) => {
+ const data = e.error?.data?.data ?? e.error?.data
+ if (data != null) {
+ const e1 = GasCheckCollector.inst.entryPoint.interface.parseError(data)
+ throw new Error(`${e1.name}(${e1.args?.toString()})`)
+ }
+ throw e
+ })
+ const ret = await GasCheckCollector.inst.entryPoint.handleOps(userOps, info.beneficiary, {
+ gasLimit: gasEst.mul(3).div(2),
+ })
+ const rcpt = await ret.wait()
+ const gasUsed = rcpt.gasUsed.toNumber()
+ const countSuccessOps = rcpt.events?.filter(
+ (e) => e.event === 'UserOperationEvent' && e.args?.success
+ ).length
+
+ rcpt.events
+ ?.filter((e) => e.event?.match(/PostOpRevertReason|UserOperationRevertReason/))
+ .find((e) => {
+ // console.log(e.event, e.args)
+ throw new Error(`${e.event}(${decodeRevertReason(e.args?.revertReason)})`)
+ })
+ // check for failure with no revert reason (e.g. OOG)
+ expect(countSuccessOps).to.eq(
+ userOps.length,
+ 'Some UserOps failed to execute (with no revert reason)'
+ )
+
+ console.debug('count', info.count, 'gasUsed', gasUsed)
+ const gasDiff = gasUsed - lastGasUsed
+ if (info.diffLastGas) {
+ console.debug('\tgas diff=', gasDiff)
+ }
+ lastGasUsed = gasUsed
+ console.debug('handleOps tx.hash=', rcpt.transactionHash)
+ const ret1: GasTestResult = {
+ count: info.count,
+ gasUsed,
+ accountEst,
+ title: info.title,
+ // receipt: rcpt
+ }
+ if (info.diffLastGas) {
+ ret1.gasDiff = gasDiff
+ }
+ console.debug(ret1)
+ return ret1
+ }
+
+ // helper methods to access the GasCheckCollector singleton
+ addRow(res: GasTestResult): void {
+ GasCheckCollector.inst.addRow(res)
+ }
+
+ entryPoint(): EntryPoint {
+ return GasCheckCollector.inst.entryPoint
+ }
+
+ skipLong(): boolean {
+ return process.env.SKIP_LONG != null
+ }
+}
+
+export class GasCheckCollector {
+ static inst: GasCheckCollector
+ static initPromise?: Promise
+
+ entryPoint: EntryPoint
+
+ static async init(): Promise {
+ if (this.inst == null) {
+ if (this.initPromise == null) {
+ this.initPromise = new GasCheckCollector()._init()
+ }
+ this.inst = await this.initPromise
+ }
+ }
+
+ async _init(entryPointAddressOrTest: string = 'test'): Promise {
+ console.log('signer=', await ethersSigner.getAddress())
+ DefaultGasTestInfo.beneficiary = createAddress()
+
+ const bal = await getBalance(ethersSigner.getAddress())
+ if (bal.gt(parseEther('100000000'))) {
+ console.log('DONT use geth miner.. use account 2 instead')
+ await checkForGeth()
+ ethersSigner = ethers.provider.getSigner(2)
+ }
+
+ if (entryPointAddressOrTest === 'test') {
+ this.entryPoint = await deployEntryPoint(provider)
+ } else {
+ this.entryPoint = EntryPoint__factory.connect(entryPointAddressOrTest, ethersSigner)
+ }
+
+ const tableHeaders = [
+ 'handleOps description ',
+ 'count',
+ 'total gasUsed',
+ 'per UserOp gas\n(delta for\none UserOp)',
+ // 'account.exec()\nestimateGas',
+ 'per UserOp overhead\n(compared to\naccount.exec())',
+ ]
+
+ this.initTable(tableHeaders)
+ return this
+ }
+
+ tableConfig: TableUserConfig
+ tabRows: any[]
+
+ /**
+ * initialize our formatted table.
+ * each header define the width of the column, so make sure to pad with spaces
+ * (we stream the table, so can't learn the content length)
+ */
+ initTable(tableHeaders: string[]): void {
+ console.log('inittable')
+
+ // multiline header - check the length of the longest line.
+ // function columnWidth (header: string): number {
+ // return Math.max(...header.split('\n').map(s => s.length))
+ // }
+
+ this.tableConfig = {
+ columnDefault: { alignment: 'right' },
+ columns: [{ alignment: 'left' }],
+ // columns: tableHeaders.map((header, index) => ({
+ // alignment: index == 0 ? 'left' : 'right',
+ // width: columnWidth(header)
+ // })),
+ // columnCount: tableHeaders.length
+ }
+ this.tabRows = [tableHeaders]
+ }
+
+ doneTable(): void {
+ fs.rmSync(gasCheckerLogFile, { force: true })
+ const write = (s: string): void => {
+ console.log(s)
+ fs.appendFileSync(gasCheckerLogFile, s + '\n')
+ }
+
+ write('== gas estimate of direct calling the account\'s "execute" method')
+ write(
+ ' the destination is "account.entryPoint()", which is known to be "hot" address used by this account'
+ )
+ write(
+ ' it little higher than EOA call: its an exec from entrypoint (or account owner) into account contract, verifying msg.sender and exec to target)'
+ )
+
+ write(
+ table(
+ Object.values(gasEstimatePerExec).map((row) => [
+ `gas estimate "${row.title}"`,
+ row.accountEst,
+ ]),
+ this.tableConfig
+ )
+ )
+
+ const tableOutput = table(this.tabRows, this.tableConfig)
+ write(tableOutput)
+ // process.exit(0)
+ }
+
+ addRow(res: GasTestResult): void {
+ const gasUsed = res.gasDiff != null ? '' : res.gasUsed // hide "total gasUsed" if there is a diff
+ const perOp = res.gasDiff != null ? res.gasDiff - res.accountEst : ''
+
+ this.tabRows.push([
+ res.title,
+ res.count,
+ gasUsed,
+ res.gasDiff ?? '',
+ // res.accountEst,
+ perOp,
+ ])
+ }
+}
+
+after(() => {
+ GasCheckCollector.inst.doneTable()
+})
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/hardhat.config.ts b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/hardhat.config.ts
new file mode 100644
index 000000000..e27408cb2
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/hardhat.config.ts
@@ -0,0 +1,86 @@
+import '@nomiclabs/hardhat-waffle'
+import '@typechain/hardhat'
+import { HardhatUserConfig, task } from 'hardhat/config'
+import 'hardhat-deploy'
+import '@nomiclabs/hardhat-etherscan'
+
+import 'solidity-coverage'
+
+import * as fs from 'fs'
+
+const SALT = '0x90d8084deab30c2a37c45e8d47f49f2f7965183cb6990a98943ef94940681de3'
+process.env.SALT = process.env.SALT ?? SALT
+
+task('deploy', 'Deploy contracts').addFlag(
+ 'simpleAccountFactory',
+ 'deploy sample factory (by default, enabled only on localhost)'
+)
+
+const mnemonicFileName = process.env.MNEMONIC_FILE!
+let mnemonic = 'test '.repeat(11) + 'junk'
+if (fs.existsSync(mnemonicFileName)) {
+ mnemonic = fs.readFileSync(mnemonicFileName, 'ascii')
+}
+
+function getNetwork1(url: string): { url: string; accounts: { mnemonic: string } } {
+ return {
+ url,
+ accounts: { mnemonic },
+ }
+}
+
+function getNetwork(name: string): { url: string; accounts: { mnemonic: string } } {
+ return getNetwork1(`https://${name}.infura.io/v3/${process.env.INFURA_ID}`)
+ // return getNetwork1(`wss://${name}.infura.io/ws/v3/${process.env.INFURA_ID}`)
+}
+
+const optimizedComilerSettings = {
+ version: '0.8.23',
+ settings: {
+ optimizer: { enabled: true, runs: 1000000 },
+ viaIR: true,
+ },
+}
+
+// You need to export an object to set up your config
+// Go to https://hardhat.org/config/ to learn more
+
+const config: HardhatUserConfig = {
+ solidity: {
+ compilers: [
+ {
+ version: '0.8.23',
+ settings: {
+ optimizer: { enabled: true, runs: 1000000 },
+ },
+ },
+ ],
+ overrides: {
+ 'contracts/core/EntryPoint.sol': optimizedComilerSettings,
+ 'contracts/samples/SimpleAccount.sol': optimizedComilerSettings,
+ },
+ },
+ networks: {
+ dev: { url: 'http://localhost:8545' },
+ // github action starts localgeth service, for gas calculations
+ localgeth: { url: 'http://localgeth:8545' },
+ goerli: getNetwork('goerli'),
+ sepolia: getNetwork('sepolia'),
+ proxy: getNetwork1('http://localhost:8545'),
+ },
+ mocha: {
+ timeout: 10000,
+ },
+ // @ts-ignore
+ etherscan: {
+ apiKey: process.env.ETHERSCAN_API_KEY,
+ },
+}
+
+// coverage chokes on the "compilers" settings
+if (process.env.COVERAGE != null) {
+ // @ts-ignore
+ config.solidity = config.solidity.compilers[0]
+}
+
+export default config
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/package.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/package.json
new file mode 100644
index 000000000..21f3550be
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/package.json
@@ -0,0 +1,71 @@
+{
+ "name": "accountabstraction",
+ "version": "0.7.0",
+ "description": "ERC-4337 Account Abstraction Implementation",
+ "scripts": {
+ "clean": "rm -rf cache artifacts typechain typechain-types",
+ "compile": "./scripts/hh-wrapper compile",
+ "tsc": "tsc",
+ "lint": "yarn compile && yarn run lint:sol && yarn run lint:js ",
+ "lint:js": "eslint -f unix .",
+ "lint-fix": "eslint -f unix . --fix",
+ "lint:sol": "solhint -f unix \"contracts/**/*.sol\" --max-warnings 0",
+ "gas-calc": "./scripts/gascalc",
+ "mocha-gascalc": "TS_NODE_TRANSPILE_ONLY=1 npx ts-mocha --bail gascalc/*",
+ "test": "./scripts/hh-wrapper test",
+ "coverage": "COVERAGE=1 hardhat coverage",
+ "deploy": "./scripts/hh-wrapper deploy",
+ "test-dev": "hardhat test --network dev",
+ "ci": "yarn compile && hardhat test && yarn run runop",
+ "ci-gas-calc": "yarn gas-calc && yarn check-gas-reports",
+ "check-gas-reports": "./scripts/check-gas-reports",
+ "runop": "hardhat run src/runop.ts "
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "@nomicfoundation/hardhat-chai-matchers": "^1.0.6",
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
+ "@nomiclabs/hardhat-waffle": "^2.0.1",
+ "@typechain/ethers-v5": "^10.1.0",
+ "@types/chai": "^4.2.21",
+ "@types/node": "^16.4.12",
+ "@typescript-eslint/eslint-plugin": "^5.30.5",
+ "@typescript-eslint/parser": "^5.30.5",
+ "@uniswap/v3-periphery": "^1.4.3",
+ "chai": "^4.3.4",
+ "eslint": "^8.19.0",
+ "eslint-config-standard": "^17.0.0",
+ "eslint-config-standard-with-typescript": "^21.0.1",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-promise": "^6.0.0",
+ "eslint-plugin-standard": "^5.0.0",
+ "ethereum-waffle": "^3.4.0",
+ "ethers": "^5.4.2",
+ "hardhat": "^2.17.2",
+ "solhint": "^3.3.7",
+ "ts-generator": "^0.1.1",
+ "ts-mocha": "^10.0.0",
+ "ts-node": "^10.1.0",
+ "typechain": "^8.1.0"
+ },
+ "dependencies": {
+ "@nomiclabs/hardhat-etherscan": "^2.1.6",
+ "@openzeppelin/contracts": "^5.0.0",
+ "@thehubbleproject/bls": "^0.5.1",
+ "@typechain/hardhat": "^2.3.0",
+ "@types/debug": "^4.1.12",
+ "@types/mocha": "^9.0.0",
+ "debug": "^4.3.4",
+ "ethereumjs-util": "^7.1.0",
+ "ethereumjs-wallet": "^1.0.1",
+ "hardhat-deploy": "^0.11.23",
+ "hardhat-deploy-ethers": "^0.3.0-beta.11",
+ "solidity-coverage": "^0.8.4",
+ "source-map-support": "^0.5.19",
+ "table": "^6.8.0",
+ "typescript": "^4.3.5"
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/reports/gas-checker.txt b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/reports/gas-checker.txt
new file mode 100644
index 000000000..692322bf7
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/reports/gas-checker.txt
@@ -0,0 +1,55 @@
+== gas estimate of direct calling the account's "execute" method
+ the destination is "account.entryPoint()", which is known to be "hot" address used by this account
+ it little higher than EOA call: its an exec from entrypoint (or account owner) into account contract, verifying msg.sender and exec to target)
+╔══════════════════════════╤════════╗
+║ gas estimate "simple" │ 28979 ║
+╟──────────────────────────┼────────╢
+║ gas estimate "big tx 5k" │ 125224 ║
+╚══════════════════════════╧════════╝
+
+╔════════════════════════════════╤═══════╤═══════════════╤════════════════╤═════════════════════╗
+║ handleOps description │ count │ total gasUsed │ per UserOp gas │ per UserOp overhead ║
+║ │ │ │ (delta for │ (compared to ║
+║ │ │ │ one UserOp) │ account.exec()) ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ simple │ 1 │ 79994 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ simple - diff from previous │ 2 │ │ 42192 │ 13213 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ simple │ 10 │ 459921 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ simple - diff from previous │ 11 │ │ 42223 │ 13244 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ simple paymaster │ 1 │ 86113 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ simple paymaster with diff │ 2 │ │ 41024 │ 12045 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ simple paymaster │ 10 │ 455444 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ simple paymaster with diff │ 11 │ │ 41088 │ 12109 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ big tx 5k │ 1 │ 181026 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ big tx - diff from previous │ 2 │ │ 142714 │ 17490 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ big tx 5k │ 10 │ 1465443 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ big tx - diff from previous │ 11 │ │ 142686 │ 17462 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ paymaster+postOp │ 1 │ 87712 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ paymaster+postOp with diff │ 2 │ │ 42671 │ 13692 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ paymaster+postOp │ 10 │ 471754 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ paymaster+postOp with diff │ 11 │ │ 42728 │ 13749 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ token paymaster │ 1 │ 128777 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ token paymaster with diff │ 2 │ │ 66386 │ 37407 ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ token paymaster │ 10 │ 726504 │ │ ║
+╟────────────────────────────────┼───────┼───────────────┼────────────────┼─────────────────────╢
+║ token paymaster with diff │ 11 │ │ 66394 │ 37415 ║
+╚════════════════════════════════╧═══════╧═══════════════╧════════════════╧═════════════════════╝
+
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/check-gas-reports b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/check-gas-reports
new file mode 100644
index 000000000..d0af47d1b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/check-gas-reports
@@ -0,0 +1,17 @@
+#!/bin/bash
+# make sure gas reports are checked in with this commit
+# dump report diff
+# exit with "1" if there is a diff, zero if no diff
+
+folder=${1:-reports}
+git diff --color=always $folder
+git diff ${folder} | grep -q .
+
+if [ "$?" == 1 ]; then
+ #diff with no error - ok
+ exit
+else
+ echo ERROR: found above unchecked reports.
+ exit 1
+fi
+
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/docker-gascalc b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/docker-gascalc
new file mode 100644
index 000000000..05c0eb274
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/docker-gascalc
@@ -0,0 +1,7 @@
+# run "yarn gas-calc" using geth with docker.
+# (if you have geth running on localhost:8545, its faster with "HARDHAT_NETWORK=dev yarn gas-calc")
+docker-compose -f `dirname $0`/docker-gascalc.yml up --abort-on-container-exit
+exit=$?
+docker-compose -f `dirname $0`/docker-gascalc.yml down
+exit $exit
+
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/docker-gascalc.yml b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/docker-gascalc.yml
new file mode 100644
index 000000000..9dd3901fc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/docker-gascalc.yml
@@ -0,0 +1,20 @@
+version: '2'
+
+services:
+ test:
+ image: node:18
+ container_name: gascalc
+ depends_on:
+ - localgeth
+ volumes:
+ - ..:/app
+ working_dir: /app
+ restart: "no"
+ environment:
+ - HARDHAT_NETWORK=localgeth
+ command: "yarn mocha-gascalc"
+
+ #configuration is a copy of github/.workflows/build.xml
+ localgeth:
+ image: dtr22/geth-dev
+ container_name: localgeth
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/gascalc b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/gascalc
new file mode 100644
index 000000000..b82f5327c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/gascalc
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# run gascalc, assuming "geth" is running on localhost, port 8545
+cd `dirname $0`/..
+function getClientVersion() {
+ curl -m 1 -s -d '{"method":"web3_clientVersion","params":[],"id":1234,"jsonrpc":"2.0"}' -H content-type:application/json localhost:8545
+}
+
+if [[ `getClientVersion` =~ "Geth" ]]; then
+ echo Using GETH on localhost:8545
+ HARDHAT_NETWORK=dev yarn mocha-gascalc
+else
+ echo No GETH running on localhost:8545. Using docker..
+ ./scripts/docker-gascalc
+fi
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/hh-wrapper b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/hh-wrapper
new file mode 100644
index 000000000..ada7d62db
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/hh-wrapper
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+set -euo pipefail
+export FORCE_COLOR=1
+hardhat "$@" 2>&1 | `dirname $0`/solcErrors
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/postpack-contracts-package.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/postpack-contracts-package.sh
new file mode 100644
index 000000000..6e1b23980
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/postpack-contracts-package.sh
@@ -0,0 +1,6 @@
+#!/bin/bash -xe
+#echo postpack for "contracts" package
+cd `dirname $0`/..
+pwd
+rm -rf contracts/artifacts
+
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/prepack-contracts-package.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/prepack-contracts-package.sh
new file mode 100644
index 000000000..eac8c94b1
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/prepack-contracts-package.sh
@@ -0,0 +1,17 @@
+#!/bin/bash -xe
+#echo prepack for "contracts" package
+
+cd `dirname $0`/..
+pwd
+if git status contracts | grep -v 'nothing to commit'|tee /dev/stderr |grep -q Untracked; then
+ exit 1
+fi
+
+yarn clean
+yarn compile
+cd contracts
+
+rm -rf artifacts
+
+mkdir -p artifacts
+cp `find ../artifacts/contracts -type f | grep -v -E 'test|Test|dbg|bls|IOracle'` artifacts/
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/sample-script.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/sample-script.js
new file mode 100644
index 000000000..a2885d539
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/sample-script.js
@@ -0,0 +1,32 @@
+// We require the Hardhat Runtime Environment explicitly here. This is optional
+// but useful for running the script in a standalone fashion through `node
+
+
+++++
+
+
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/contract.hbs b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/contract.hbs
new file mode 100644
index 000000000..aaca0a3cc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/contract.hbs
@@ -0,0 +1,137 @@
+{{#each items}}
+:{{name}}: pass:normal[xref:#{{anchor}}[`++{{name}}++`]]
+{{/each}}
+
+[.contract]
+[[{{anchor}}]]
+=== `++{{name}}++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v{{oz-version}}/{{__item_context.file.absolutePath}}[{github-icon},role=heading-link]
+
+[.hljs-theme-light.nopadding]
+```solidity
+import "@openzeppelin/{{__item_context.file.absolutePath}}";
+```
+
+{{{natspec.dev}}}
+
+{{#if modifiers}}
+[.contract-index]
+.Modifiers
+--
+{{#each modifiers}}
+* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`]
+{{/each}}
+--
+{{/if}}
+
+{{#if has-functions}}
+[.contract-index]
+.Functions
+--
+{{#each inherited-functions}}
+{{#unless @first}}
+[.contract-subindex-inherited]
+.{{contract.name}}
+{{/unless}}
+{{#each functions}}
+* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`]
+{{/each}}
+
+{{/each}}
+--
+{{/if}}
+
+{{#if has-events}}
+[.contract-index]
+.Events
+--
+{{#each inheritance}}
+{{#unless @first}}
+[.contract-subindex-inherited]
+.{{name}}
+{{/unless}}
+{{#each events}}
+* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`]
+{{/each}}
+
+{{/each}}
+--
+{{/if}}
+
+{{#if has-errors}}
+[.contract-index]
+.Errors
+--
+{{#each inheritance}}
+{{#unless @first}}
+[.contract-subindex-inherited]
+.{{name}}
+{{/unless}}
+{{#each errors}}
+* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`]
+{{/each}}
+
+{{/each}}
+--
+{{/if}}
+
+{{#if has-internal-variables}}
+[.contract-index]
+.Internal Variables
+--
+{{#each inheritance}}
+{{#unless @first}}
+[.contract-subindex-inherited]
+.{{name}}
+{{/unless}}
+{{#each internal-variables}}
+* {xref-{{anchor~}} }[`++{{typeDescriptions.typeString}} {{#if constant}}constant{{/if}} {{name}}++`]
+{{/each}}
+
+{{/each}}
+--
+{{/if}}
+
+{{#each modifiers}}
+[.contract-item]
+[[{{anchor}}]]
+==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}})++` [.item-kind]#modifier#
+
+{{{natspec.dev}}}
+
+{{/each}}
+
+{{#each functions}}
+[.contract-item]
+[[{{anchor}}]]
+==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}}){{#if returns2}} → {{typed-params returns2}}{{/if}}++` [.item-kind]#{{visibility}}#
+
+{{{natspec.dev}}}
+
+{{/each}}
+
+{{#each events}}
+[.contract-item]
+[[{{anchor}}]]
+==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}})++` [.item-kind]#event#
+
+{{{natspec.dev}}}
+
+{{/each}}
+
+{{#each errors}}
+[.contract-item]
+[[{{anchor}}]]
+==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}})++` [.item-kind]#error#
+
+{{{natspec.dev}}}
+
+{{/each}}
+
+{{#each internal-variables}}
+[.contract-item]
+[[{{anchor}}]]
+==== `{{typeDescriptions.typeString}} [.contract-item-name]#++{{name}}++#` [.item-kind]#internal{{#if constant}} constant{{/if}}#
+
+{{{natspec.dev}}}
+
+{{/each}}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/helpers.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/helpers.js
new file mode 100644
index 000000000..1b6383549
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/helpers.js
@@ -0,0 +1,46 @@
+const { version } = require('../../package.json');
+
+module.exports['oz-version'] = () => version;
+
+module.exports['readme-path'] = opts => {
+ return 'contracts/' + opts.data.root.id.replace(/\.adoc$/, '') + '/README.adoc';
+};
+
+module.exports.names = params => params?.map(p => p.name).join(', ');
+
+module.exports['typed-params'] = params => {
+ return params?.map(p => `${p.type}${p.indexed ? ' indexed' : ''}${p.name ? ' ' + p.name : ''}`).join(', ');
+};
+
+const slug = (module.exports.slug = str => {
+ if (str === undefined) {
+ throw new Error('Missing argument');
+ }
+ return str.replace(/\W/g, '-');
+});
+
+const linksCache = new WeakMap();
+
+function getAllLinks(items) {
+ if (linksCache.has(items)) {
+ return linksCache.get(items);
+ }
+ const res = {};
+ linksCache.set(items, res);
+ for (const item of items) {
+ res[`xref-${item.anchor}`] = `xref:${item.__item_context.page}#${item.anchor}`;
+ res[slug(item.fullName)] = `pass:normal[xref:${item.__item_context.page}#${item.anchor}[\`${item.fullName}\`]]`;
+ }
+ return res;
+}
+
+module.exports['with-prelude'] = opts => {
+ const links = getAllLinks(opts.data.site.items);
+ const contents = opts.fn();
+ const neededLinks = contents
+ .match(/\{[-._a-z0-9]+\}/gi)
+ .map(m => m.replace(/^\{(.+)\}$/, '$1'))
+ .filter(k => k in links);
+ const prelude = neededLinks.map(k => `:${k}: ${links[k]}`).join('\n');
+ return prelude + '\n' + contents;
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/page.hbs b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/page.hbs
new file mode 100644
index 000000000..cab050acb
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/page.hbs
@@ -0,0 +1,4 @@
+:github-icon: pass:[]
+{{#with-prelude}}
+{{readme (readme-path)}}
+{{/with-prelude}}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/properties.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/properties.js
new file mode 100644
index 000000000..52eebac54
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/properties.js
@@ -0,0 +1,72 @@
+const { isNodeType, findAll } = require('solidity-ast/utils');
+const { slug } = require('./helpers');
+
+module.exports.anchor = function anchor({ item, contract }) {
+ let res = '';
+ if (contract) {
+ res += contract.name + '-';
+ }
+ res += item.name;
+ if ('parameters' in item) {
+ const signature = item.parameters.parameters.map(v => v.typeName.typeDescriptions.typeString).join(',');
+ res += slug('(' + signature + ')');
+ }
+ if (isNodeType('VariableDeclaration', item)) {
+ res += '-' + slug(item.typeName.typeDescriptions.typeString);
+ }
+ return res;
+};
+
+module.exports.inheritance = function ({ item, build }) {
+ if (!isNodeType('ContractDefinition', item)) {
+ throw new Error('used inherited-items on non-contract');
+ }
+
+ return item.linearizedBaseContracts
+ .map(id => build.deref('ContractDefinition', id))
+ .filter((c, i) => c.name !== 'Context' || i === 0);
+};
+
+module.exports['has-functions'] = function ({ item }) {
+ return item.inheritance.some(c => c.functions.length > 0);
+};
+
+module.exports['has-events'] = function ({ item }) {
+ return item.inheritance.some(c => c.events.length > 0);
+};
+
+module.exports['has-errors'] = function ({ item }) {
+ return item.inheritance.some(c => c.errors.length > 0);
+};
+
+module.exports['internal-variables'] = function ({ item }) {
+ return item.variables.filter(({ visibility }) => visibility === 'internal');
+};
+
+module.exports['has-internal-variables'] = function ({ item }) {
+ return module.exports['internal-variables']({ item }).length > 0;
+};
+
+module.exports.functions = function ({ item }) {
+ return [
+ ...[...findAll('FunctionDefinition', item)].filter(f => f.visibility !== 'private'),
+ ...[...findAll('VariableDeclaration', item)].filter(f => f.visibility === 'public'),
+ ];
+};
+
+module.exports.returns2 = function ({ item }) {
+ if (isNodeType('VariableDeclaration', item)) {
+ return [{ type: item.typeDescriptions.typeString }];
+ } else {
+ return item.returns;
+ }
+};
+
+module.exports['inherited-functions'] = function ({ item }) {
+ const { inheritance } = item;
+ const baseFunctions = new Set(inheritance.flatMap(c => c.functions.flatMap(f => f.baseFunctions ?? [])));
+ return inheritance.map((contract, i) => ({
+ contract,
+ functions: contract.functions.filter(f => !baseFunctions.has(f.id) && (f.name !== 'constructor' || i === 0)),
+ }));
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/eslint.config.mjs b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/eslint.config.mjs
new file mode 100644
index 000000000..00fcc95bb
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/eslint.config.mjs
@@ -0,0 +1,26 @@
+import js from '@eslint/js';
+import { includeIgnoreFile } from '@eslint/compat';
+import prettier from 'eslint-config-prettier';
+import globals from 'globals';
+import path from 'path';
+
+export default [
+ js.configs.recommended,
+ prettier,
+ {
+ languageOptions: {
+ ecmaVersion: 2022,
+ globals: {
+ ...globals.browser,
+ ...globals.mocha,
+ ...globals.node,
+ artifacts: 'readonly',
+ contract: 'readonly',
+ web3: 'readonly',
+ extendEnvironment: 'readonly',
+ expect: 'readonly',
+ },
+ },
+ },
+ includeIgnoreFile(path.resolve(import.meta.dirname, '.gitignore')),
+];
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/foundry.toml b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/foundry.toml
new file mode 100644
index 000000000..78dd07812
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/foundry.toml
@@ -0,0 +1,15 @@
+[profile.default]
+solc_version = '0.8.24'
+evm_version = 'cancun'
+optimizer = true
+optimizer-runs = 200
+src = 'contracts'
+out = 'out'
+libs = ['node_modules', 'lib']
+test = 'test'
+cache_path = 'cache_forge'
+fs_permissions = [{ access = "read", path = "./test/bin" }]
+
+[fuzz]
+runs = 5000
+max_test_rejects = 150000
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/fv-requirements.txt b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/fv-requirements.txt
new file mode 100644
index 000000000..608b4de24
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/fv-requirements.txt
@@ -0,0 +1,4 @@
+certora-cli==4.13.1
+# File uses a custom name (fv-requirements.txt) so that it isn't picked by Netlify's build
+# whose latest Python version is 0.3.8, incompatible with most recent versions of Halmos
+halmos==0.2.0
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat.config.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat.config.js
new file mode 100644
index 000000000..d39d3d073
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat.config.js
@@ -0,0 +1,124 @@
+/// ENVVAR
+// - COMPILER: compiler version (default: 0.8.24)
+// - SRC: contracts folder to compile (default: contracts)
+// - RUNS: number of optimization runs (default: 200)
+// - IR: enable IR compilation (default: false)
+// - COVERAGE: enable coverage report (default: false)
+// - GAS: enable gas report (default: false)
+// - COINMARKETCAP: coinmarketcap api key for USD value in gas report
+// - CI: output gas report to file instead of stdout
+
+const fs = require('fs');
+const path = require('path');
+
+const { argv } = require('yargs/yargs')()
+ .env('')
+ .options({
+ // Compilation settings
+ compiler: {
+ alias: 'compileVersion',
+ type: 'string',
+ default: '0.8.24',
+ },
+ src: {
+ alias: 'source',
+ type: 'string',
+ default: 'contracts',
+ },
+ runs: {
+ alias: 'optimizationRuns',
+ type: 'number',
+ default: 200,
+ },
+ ir: {
+ alias: 'enableIR',
+ type: 'boolean',
+ default: false,
+ },
+ evm: {
+ alias: 'evmVersion',
+ type: 'string',
+ default: 'cancun',
+ },
+ // Extra modules
+ coverage: {
+ type: 'boolean',
+ default: false,
+ },
+ gas: {
+ alias: 'enableGasReport',
+ type: 'boolean',
+ default: false,
+ },
+ coinmarketcap: {
+ alias: 'coinmarketcapApiKey',
+ type: 'string',
+ },
+ });
+
+require('@nomicfoundation/hardhat-chai-matchers');
+require('@nomicfoundation/hardhat-ethers');
+require('hardhat-exposed');
+require('hardhat-gas-reporter');
+require('hardhat-ignore-warnings');
+require('solidity-coverage');
+require('solidity-docgen');
+
+for (const f of fs.readdirSync(path.join(__dirname, 'hardhat'))) {
+ require(path.join(__dirname, 'hardhat', f));
+}
+
+/**
+ * @type import('hardhat/config').HardhatUserConfig
+ */
+module.exports = {
+ solidity: {
+ version: argv.compiler,
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: argv.runs,
+ },
+ evmVersion: argv.evm,
+ viaIR: argv.ir,
+ outputSelection: { '*': { '*': ['storageLayout'] } },
+ },
+ },
+ warnings: {
+ 'contracts-exposed/**/*': {
+ 'code-size': 'off',
+ 'initcode-size': 'off',
+ },
+ '*': {
+ 'code-size': true,
+ 'unused-param': !argv.coverage, // coverage causes unused-param warnings
+ 'transient-storage': false,
+ default: 'error',
+ },
+ },
+ networks: {
+ hardhat: {
+ hardfork: argv.evm,
+ // Exposed contracts often exceed the maximum contract size. For normal contract,
+ // we rely on the `code-size` compiler warning, that will cause a compilation error.
+ allowUnlimitedContractSize: true,
+ initialBaseFeePerGas: argv.coverage ? 0 : undefined,
+ },
+ },
+ exposed: {
+ imports: true,
+ initializers: true,
+ exclude: ['vendor/**/*', '**/*WithInit.sol'],
+ },
+ gasReporter: {
+ enabled: argv.gas,
+ showMethodSig: true,
+ includeBytecodeInJSON: true,
+ currency: 'USD',
+ coinmarketcap: argv.coinmarketcap,
+ },
+ paths: {
+ sources: argv.src,
+ },
+ docgen: require('./docs/config'),
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/async-test-sanity.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/async-test-sanity.js
new file mode 100644
index 000000000..c05e5bd48
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/async-test-sanity.js
@@ -0,0 +1,3 @@
+process.on('unhandledRejection', reason => {
+ throw new Error(reason);
+});
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/env-artifacts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/env-artifacts.js
new file mode 100644
index 000000000..e97ae6468
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/env-artifacts.js
@@ -0,0 +1,29 @@
+const { HardhatError } = require('hardhat/internal/core/errors');
+
+function isExpectedError(e, suffix) {
+ // HH700: Artifact not found - from https://hardhat.org/hardhat-runner/docs/errors#HH700
+ return HardhatError.isHardhatError(e) && e.number === 700 && suffix !== '';
+}
+
+// Modifies the artifact require functions so that instead of X it loads the XUpgradeable contract.
+// This allows us to run the same test suite on both the original and the transpiled and renamed Upgradeable contracts.
+extendEnvironment(hre => {
+ const suffixes = ['UpgradeableWithInit', 'Upgradeable', ''];
+
+ // Ethers
+ const originalReadArtifact = hre.artifacts.readArtifact;
+ hre.artifacts.readArtifact = async function (name) {
+ for (const suffix of suffixes) {
+ try {
+ return await originalReadArtifact.call(this, name + suffix);
+ } catch (e) {
+ if (isExpectedError(e, suffix)) {
+ continue;
+ } else {
+ throw e;
+ }
+ }
+ }
+ throw new Error('Unreachable');
+ };
+});
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js
new file mode 100644
index 000000000..8e3e34340
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js
@@ -0,0 +1,45 @@
+// Warnings about unreachable code are emitted with a source location that corresponds to the unreachable code.
+// We have some testing contracts that purposely cause unreachable code, but said code is in the library contracts, and
+// with hardhat-ignore-warnings we are not able to selectively ignore them without potentially ignoring relevant
+// warnings that we don't want to miss.
+// Thus, we need to handle these warnings separately. We force Hardhat to compile them in a separate compilation job and
+// then ignore the warnings about unreachable code that come from that compilation job.
+
+const { task } = require('hardhat/config');
+const {
+ TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE,
+ TASK_COMPILE_SOLIDITY_COMPILE,
+} = require('hardhat/builtin-tasks/task-names');
+
+const marker = Symbol('unreachable');
+const markedCache = new WeakMap();
+
+task(TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, async (params, _, runSuper) => {
+ const job = await runSuper(params);
+ // If the file is in the unreachable directory, we make a copy of the config and mark it, which will cause it to get
+ // compiled separately (along with the other marked files).
+ if (params.file.sourceName.startsWith('contracts/mocks/') && /\bunreachable\b/.test(params.file.sourceName)) {
+ const originalConfig = job.solidityConfig;
+ let markedConfig = markedCache.get(originalConfig);
+ if (markedConfig === undefined) {
+ markedConfig = { ...originalConfig, [marker]: true };
+ markedCache.set(originalConfig, markedConfig);
+ }
+ job.solidityConfig = markedConfig;
+ }
+ return job;
+});
+
+const W_UNREACHABLE_CODE = '5740';
+
+task(TASK_COMPILE_SOLIDITY_COMPILE, async (params, _, runSuper) => {
+ const marked = params.compilationJob.solidityConfig[marker];
+ const result = await runSuper(params);
+ if (marked) {
+ result.output = {
+ ...result.output,
+ errors: result.output.errors?.filter(e => e.severity !== 'warning' || e.errorCode !== W_UNREACHABLE_CODE),
+ };
+ }
+ return result;
+});
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/remappings.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/remappings.js
new file mode 100644
index 000000000..cd9984d44
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/remappings.js
@@ -0,0 +1,18 @@
+const fs = require('fs');
+const { task } = require('hardhat/config');
+const { TASK_COMPILE_GET_REMAPPINGS } = require('hardhat/builtin-tasks/task-names');
+
+task(TASK_COMPILE_GET_REMAPPINGS).setAction((taskArgs, env, runSuper) =>
+ runSuper().then(remappings =>
+ Object.assign(
+ remappings,
+ Object.fromEntries(
+ fs
+ .readFileSync('remappings.txt', 'utf-8')
+ .split('\n')
+ .filter(Boolean)
+ .map(line => line.trim().split('=')),
+ ),
+ ),
+ ),
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js
new file mode 100644
index 000000000..965ba37c3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js
@@ -0,0 +1,6 @@
+const { subtask } = require('hardhat/config');
+const { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } = require('hardhat/builtin-tasks/task-names');
+
+subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(async (_, __, runSuper) =>
+ (await runSuper()).filter(path => !path.endsWith('.t.sol')),
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/task-test-get-files.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/task-test-get-files.js
new file mode 100644
index 000000000..108f40a42
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/task-test-get-files.js
@@ -0,0 +1,25 @@
+const { internalTask } = require('hardhat/config');
+const { TASK_TEST_GET_TEST_FILES } = require('hardhat/builtin-tasks/task-names');
+
+// Modifies `hardhat test` to skip the proxy tests after proxies are removed by the transpiler for upgradeability.
+
+internalTask(TASK_TEST_GET_TEST_FILES).setAction(async (args, hre, runSuper) => {
+ const path = require('path');
+ const { promises: fs } = require('fs');
+
+ const hasProxies = await fs
+ .access(path.join(hre.config.paths.sources, 'proxy/Proxy.sol'))
+ .then(() => true)
+ .catch(() => false);
+
+ const ignoredIfProxy = [
+ 'proxy/beacon/BeaconProxy.test.js',
+ 'proxy/beacon/UpgradeableBeacon.test.js',
+ 'proxy/ERC1967/ERC1967Proxy.test.js',
+ 'proxy/transparent/ProxyAdmin.test.js',
+ 'proxy/transparent/TransparentUpgradeableProxy.test.js',
+ 'proxy/utils/UUPSUpgradeable.test.js',
+ ].map(p => path.join(hre.config.paths.tests, p));
+
+ return (await runSuper(args)).filter(file => hasProxies || !ignoredIfProxy.includes(file));
+});
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.prop.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.prop.sol
new file mode 100644
index 000000000..c34512baa
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.prop.sol
@@ -0,0 +1,404 @@
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity >=0.8.0 <0.9.0;
+
+import "forge-std/Test.sol";
+
+// TODO: use interface provided by forge-std v1.0.0 or later
+// import {IERC20} from "forge-std/interfaces/IERC20.sol";
+interface IERC20 {
+ event Transfer(address indexed from, address indexed to, uint value);
+ event Approval(address indexed owner, address indexed spender, uint value);
+ function totalSupply() external view returns (uint);
+ function balanceOf(address account) external view returns (uint);
+ function transfer(address to, uint amount) external returns (bool);
+ function allowance(address owner, address spender) external view returns (uint);
+ function approve(address spender, uint amount) external returns (bool);
+ function transferFrom(address from, address to, uint amount) external returns (bool);
+}
+
+// TODO: use interface provided by forge-std v1.0.0 or later
+// import {IERC4626} from "forge-std/interfaces/IERC4626.sol";
+interface IERC4626 is IERC20 {
+ event Deposit(address indexed caller, address indexed owner, uint assets, uint shares);
+ event Withdraw(address indexed caller, address indexed receiver, address indexed owner, uint assets, uint shares);
+ function asset() external view returns (address assetTokenAddress);
+ function totalAssets() external view returns (uint totalManagedAssets);
+ function convertToShares(uint assets) external view returns (uint shares);
+ function convertToAssets(uint shares) external view returns (uint assets);
+ function maxDeposit(address receiver) external view returns (uint maxAssets);
+ function previewDeposit(uint assets) external view returns (uint shares);
+ function deposit(uint assets, address receiver) external returns (uint shares);
+ function maxMint(address receiver) external view returns (uint maxShares);
+ function previewMint(uint shares) external view returns (uint assets);
+ function mint(uint shares, address receiver) external returns (uint assets);
+ function maxWithdraw(address owner) external view returns (uint maxAssets);
+ function previewWithdraw(uint assets) external view returns (uint shares);
+ function withdraw(uint assets, address receiver, address owner) external returns (uint shares);
+ function maxRedeem(address owner) external view returns (uint maxShares);
+ function previewRedeem(uint shares) external view returns (uint assets);
+ function redeem(uint shares, address receiver, address owner) external returns (uint assets);
+}
+
+abstract contract ERC4626Prop is Test {
+ uint internal _delta_;
+
+ address internal _underlying_;
+ address internal _vault_;
+
+ bool internal _vaultMayBeEmpty;
+ bool internal _unlimitedAmount;
+
+ //
+ // asset
+ //
+
+ // asset
+ // "MUST NOT revert."
+ function prop_asset(address caller) public {
+ vm.prank(caller); IERC4626(_vault_).asset();
+ }
+
+ // totalAssets
+ // "MUST NOT revert."
+ function prop_totalAssets(address caller) public {
+ vm.prank(caller); IERC4626(_vault_).totalAssets();
+ }
+
+ //
+ // convert
+ //
+
+ // convertToShares
+ // "MUST NOT show any variations depending on the caller."
+ function prop_convertToShares(address caller1, address caller2, uint assets) public {
+ vm.prank(caller1); uint res1 = vault_convertToShares(assets); // "MAY revert due to integer overflow caused by an unreasonably large input."
+ vm.prank(caller2); uint res2 = vault_convertToShares(assets); // "MAY revert due to integer overflow caused by an unreasonably large input."
+ assertEq(res1, res2);
+ }
+
+ // convertToAssets
+ // "MUST NOT show any variations depending on the caller."
+ function prop_convertToAssets(address caller1, address caller2, uint shares) public {
+ vm.prank(caller1); uint res1 = vault_convertToAssets(shares); // "MAY revert due to integer overflow caused by an unreasonably large input."
+ vm.prank(caller2); uint res2 = vault_convertToAssets(shares); // "MAY revert due to integer overflow caused by an unreasonably large input."
+ assertEq(res1, res2);
+ }
+
+ //
+ // deposit
+ //
+
+ // maxDeposit
+ // "MUST NOT revert."
+ function prop_maxDeposit(address caller, address receiver) public {
+ vm.prank(caller); IERC4626(_vault_).maxDeposit(receiver);
+ }
+
+ // previewDeposit
+ // "MUST return as close to and no more than the exact amount of Vault
+ // shares that would be minted in a deposit call in the same transaction.
+ // I.e. deposit should return the same or more shares as previewDeposit if
+ // called in the same transaction."
+ function prop_previewDeposit(address caller, address receiver, address other, uint assets) public {
+ vm.prank(other); uint sharesPreview = vault_previewDeposit(assets); // "MAY revert due to other conditions that would also cause deposit to revert."
+ vm.prank(caller); uint sharesActual = vault_deposit(assets, receiver);
+ assertApproxGeAbs(sharesActual, sharesPreview, _delta_);
+ }
+
+ // deposit
+ function prop_deposit(address caller, address receiver, uint assets) public {
+ uint oldCallerAsset = IERC20(_underlying_).balanceOf(caller);
+ uint oldReceiverShare = IERC20(_vault_).balanceOf(receiver);
+ uint oldAllowance = IERC20(_underlying_).allowance(caller, _vault_);
+
+ vm.prank(caller); uint shares = vault_deposit(assets, receiver);
+
+ uint newCallerAsset = IERC20(_underlying_).balanceOf(caller);
+ uint newReceiverShare = IERC20(_vault_).balanceOf(receiver);
+ uint newAllowance = IERC20(_underlying_).allowance(caller, _vault_);
+
+ assertApproxEqAbs(newCallerAsset, oldCallerAsset - assets, _delta_, "asset"); // NOTE: this may fail if the caller is a contract in which the asset is stored
+ assertApproxEqAbs(newReceiverShare, oldReceiverShare + shares, _delta_, "share");
+ if (oldAllowance != type(uint).max) assertApproxEqAbs(newAllowance, oldAllowance - assets, _delta_, "allowance");
+ }
+
+ //
+ // mint
+ //
+
+ // maxMint
+ // "MUST NOT revert."
+ function prop_maxMint(address caller, address receiver) public {
+ vm.prank(caller); IERC4626(_vault_).maxMint(receiver);
+ }
+
+ // previewMint
+ // "MUST return as close to and no fewer than the exact amount of assets
+ // that would be deposited in a mint call in the same transaction. I.e. mint
+ // should return the same or fewer assets as previewMint if called in the
+ // same transaction."
+ function prop_previewMint(address caller, address receiver, address other, uint shares) public {
+ vm.prank(other); uint assetsPreview = vault_previewMint(shares);
+ vm.prank(caller); uint assetsActual = vault_mint(shares, receiver);
+ assertApproxLeAbs(assetsActual, assetsPreview, _delta_);
+ }
+
+ // mint
+ function prop_mint(address caller, address receiver, uint shares) public {
+ uint oldCallerAsset = IERC20(_underlying_).balanceOf(caller);
+ uint oldReceiverShare = IERC20(_vault_).balanceOf(receiver);
+ uint oldAllowance = IERC20(_underlying_).allowance(caller, _vault_);
+
+ vm.prank(caller); uint assets = vault_mint(shares, receiver);
+
+ uint newCallerAsset = IERC20(_underlying_).balanceOf(caller);
+ uint newReceiverShare = IERC20(_vault_).balanceOf(receiver);
+ uint newAllowance = IERC20(_underlying_).allowance(caller, _vault_);
+
+ assertApproxEqAbs(newCallerAsset, oldCallerAsset - assets, _delta_, "asset"); // NOTE: this may fail if the caller is a contract in which the asset is stored
+ assertApproxEqAbs(newReceiverShare, oldReceiverShare + shares, _delta_, "share");
+ if (oldAllowance != type(uint).max) assertApproxEqAbs(newAllowance, oldAllowance - assets, _delta_, "allowance");
+ }
+
+ //
+ // withdraw
+ //
+
+ // maxWithdraw
+ // "MUST NOT revert."
+ // NOTE: some implementations failed due to arithmetic overflow
+ function prop_maxWithdraw(address caller, address owner) public {
+ vm.prank(caller); IERC4626(_vault_).maxWithdraw(owner);
+ }
+
+ // previewWithdraw
+ // "MUST return as close to and no fewer than the exact amount of Vault
+ // shares that would be burned in a withdraw call in the same transaction.
+ // I.e. withdraw should return the same or fewer shares as previewWithdraw
+ // if called in the same transaction."
+ function prop_previewWithdraw(address caller, address receiver, address owner, address other, uint assets) public {
+ vm.prank(other); uint preview = vault_previewWithdraw(assets);
+ vm.prank(caller); uint actual = vault_withdraw(assets, receiver, owner);
+ assertApproxLeAbs(actual, preview, _delta_);
+ }
+
+ // withdraw
+ function prop_withdraw(address caller, address receiver, address owner, uint assets) public {
+ uint oldReceiverAsset = IERC20(_underlying_).balanceOf(receiver);
+ uint oldOwnerShare = IERC20(_vault_).balanceOf(owner);
+ uint oldAllowance = IERC20(_vault_).allowance(owner, caller);
+
+ vm.prank(caller); uint shares = vault_withdraw(assets, receiver, owner);
+
+ uint newReceiverAsset = IERC20(_underlying_).balanceOf(receiver);
+ uint newOwnerShare = IERC20(_vault_).balanceOf(owner);
+ uint newAllowance = IERC20(_vault_).allowance(owner, caller);
+
+ assertApproxEqAbs(newOwnerShare, oldOwnerShare - shares, _delta_, "share");
+ assertApproxEqAbs(newReceiverAsset, oldReceiverAsset + assets, _delta_, "asset"); // NOTE: this may fail if the receiver is a contract in which the asset is stored
+ if (caller != owner && oldAllowance != type(uint).max) assertApproxEqAbs(newAllowance, oldAllowance - shares, _delta_, "allowance");
+
+ assertTrue(caller == owner || oldAllowance != 0 || (shares == 0 && assets == 0), "access control");
+ }
+
+ //
+ // redeem
+ //
+
+ // maxRedeem
+ // "MUST NOT revert."
+ function prop_maxRedeem(address caller, address owner) public {
+ vm.prank(caller); IERC4626(_vault_).maxRedeem(owner);
+ }
+
+ // previewRedeem
+ // "MUST return as close to and no more than the exact amount of assets that
+ // would be withdrawn in a redeem call in the same transaction. I.e. redeem
+ // should return the same or more assets as previewRedeem if called in the
+ // same transaction."
+ function prop_previewRedeem(address caller, address receiver, address owner, address other, uint shares) public {
+ vm.prank(other); uint preview = vault_previewRedeem(shares);
+ vm.prank(caller); uint actual = vault_redeem(shares, receiver, owner);
+ assertApproxGeAbs(actual, preview, _delta_);
+ }
+
+ // redeem
+ function prop_redeem(address caller, address receiver, address owner, uint shares) public {
+ uint oldReceiverAsset = IERC20(_underlying_).balanceOf(receiver);
+ uint oldOwnerShare = IERC20(_vault_).balanceOf(owner);
+ uint oldAllowance = IERC20(_vault_).allowance(owner, caller);
+
+ vm.prank(caller); uint assets = vault_redeem(shares, receiver, owner);
+
+ uint newReceiverAsset = IERC20(_underlying_).balanceOf(receiver);
+ uint newOwnerShare = IERC20(_vault_).balanceOf(owner);
+ uint newAllowance = IERC20(_vault_).allowance(owner, caller);
+
+ assertApproxEqAbs(newOwnerShare, oldOwnerShare - shares, _delta_, "share");
+ assertApproxEqAbs(newReceiverAsset, oldReceiverAsset + assets, _delta_, "asset"); // NOTE: this may fail if the receiver is a contract in which the asset is stored
+ if (caller != owner && oldAllowance != type(uint).max) assertApproxEqAbs(newAllowance, oldAllowance - shares, _delta_, "allowance");
+
+ assertTrue(caller == owner || oldAllowance != 0 || (shares == 0 && assets == 0), "access control");
+ }
+
+ //
+ // round trip properties
+ //
+
+ // redeem(deposit(a)) <= a
+ function prop_RT_deposit_redeem(address caller, uint assets) public {
+ if (!_vaultMayBeEmpty) vm.assume(IERC20(_vault_).totalSupply() > 0);
+ vm.prank(caller); uint shares = vault_deposit(assets, caller);
+ vm.prank(caller); uint assets2 = vault_redeem(shares, caller, caller);
+ assertApproxLeAbs(assets2, assets, _delta_);
+ }
+
+ // s = deposit(a)
+ // s' = withdraw(a)
+ // s' >= s
+ function prop_RT_deposit_withdraw(address caller, uint assets) public {
+ if (!_vaultMayBeEmpty) vm.assume(IERC20(_vault_).totalSupply() > 0);
+ vm.prank(caller); uint shares1 = vault_deposit(assets, caller);
+ vm.prank(caller); uint shares2 = vault_withdraw(assets, caller, caller);
+ assertApproxGeAbs(shares2, shares1, _delta_);
+ }
+
+ // deposit(redeem(s)) <= s
+ function prop_RT_redeem_deposit(address caller, uint shares) public {
+ vm.prank(caller); uint assets = vault_redeem(shares, caller, caller);
+ if (!_vaultMayBeEmpty) vm.assume(IERC20(_vault_).totalSupply() > 0);
+ vm.prank(caller); uint shares2 = vault_deposit(assets, caller);
+ assertApproxLeAbs(shares2, shares, _delta_);
+ }
+
+ // a = redeem(s)
+ // a' = mint(s)
+ // a' >= a
+ function prop_RT_redeem_mint(address caller, uint shares) public {
+ vm.prank(caller); uint assets1 = vault_redeem(shares, caller, caller);
+ if (!_vaultMayBeEmpty) vm.assume(IERC20(_vault_).totalSupply() > 0);
+ vm.prank(caller); uint assets2 = vault_mint(shares, caller);
+ assertApproxGeAbs(assets2, assets1, _delta_);
+ }
+
+ // withdraw(mint(s)) >= s
+ function prop_RT_mint_withdraw(address caller, uint shares) public {
+ if (!_vaultMayBeEmpty) vm.assume(IERC20(_vault_).totalSupply() > 0);
+ vm.prank(caller); uint assets = vault_mint(shares, caller);
+ vm.prank(caller); uint shares2 = vault_withdraw(assets, caller, caller);
+ assertApproxGeAbs(shares2, shares, _delta_);
+ }
+
+ // a = mint(s)
+ // a' = redeem(s)
+ // a' <= a
+ function prop_RT_mint_redeem(address caller, uint shares) public {
+ if (!_vaultMayBeEmpty) vm.assume(IERC20(_vault_).totalSupply() > 0);
+ vm.prank(caller); uint assets1 = vault_mint(shares, caller);
+ vm.prank(caller); uint assets2 = vault_redeem(shares, caller, caller);
+ assertApproxLeAbs(assets2, assets1, _delta_);
+ }
+
+ // mint(withdraw(a)) >= a
+ function prop_RT_withdraw_mint(address caller, uint assets) public {
+ vm.prank(caller); uint shares = vault_withdraw(assets, caller, caller);
+ if (!_vaultMayBeEmpty) vm.assume(IERC20(_vault_).totalSupply() > 0);
+ vm.prank(caller); uint assets2 = vault_mint(shares, caller);
+ assertApproxGeAbs(assets2, assets, _delta_);
+ }
+
+ // s = withdraw(a)
+ // s' = deposit(a)
+ // s' <= s
+ function prop_RT_withdraw_deposit(address caller, uint assets) public {
+ vm.prank(caller); uint shares1 = vault_withdraw(assets, caller, caller);
+ if (!_vaultMayBeEmpty) vm.assume(IERC20(_vault_).totalSupply() > 0);
+ vm.prank(caller); uint shares2 = vault_deposit(assets, caller);
+ assertApproxLeAbs(shares2, shares1, _delta_);
+ }
+
+ //
+ // utils
+ //
+
+ function vault_convertToShares(uint assets) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.convertToShares.selector, assets));
+ }
+ function vault_convertToAssets(uint shares) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.convertToAssets.selector, shares));
+ }
+
+ function vault_maxDeposit(address receiver) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.maxDeposit.selector, receiver));
+ }
+ function vault_maxMint(address receiver) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.maxMint.selector, receiver));
+ }
+ function vault_maxWithdraw(address owner) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.maxWithdraw.selector, owner));
+ }
+ function vault_maxRedeem(address owner) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.maxRedeem.selector, owner));
+ }
+
+ function vault_previewDeposit(uint assets) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.previewDeposit.selector, assets));
+ }
+ function vault_previewMint(uint shares) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.previewMint.selector, shares));
+ }
+ function vault_previewWithdraw(uint assets) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.previewWithdraw.selector, assets));
+ }
+ function vault_previewRedeem(uint shares) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.previewRedeem.selector, shares));
+ }
+
+ function vault_deposit(uint assets, address receiver) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.deposit.selector, assets, receiver));
+ }
+ function vault_mint(uint shares, address receiver) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.mint.selector, shares, receiver));
+ }
+ function vault_withdraw(uint assets, address receiver, address owner) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.withdraw.selector, assets, receiver, owner));
+ }
+ function vault_redeem(uint shares, address receiver, address owner) internal returns (uint) {
+ return _call_vault(abi.encodeWithSelector(IERC4626.redeem.selector, shares, receiver, owner));
+ }
+
+ function _call_vault(bytes memory data) internal returns (uint) {
+ (bool success, bytes memory retdata) = _vault_.call(data);
+ if (success) return abi.decode(retdata, (uint));
+ vm.assume(false); // if reverted, discard the current fuzz inputs, and let the fuzzer to start a new fuzz run
+ return 0; // silence warning
+ }
+
+ function assertApproxGeAbs(uint a, uint b, uint maxDelta) internal {
+ if (!(a >= b)) {
+ uint dt = b - a;
+ if (dt > maxDelta) {
+ emit log ("Error: a >=~ b not satisfied [uint]");
+ emit log_named_uint (" Value a", a);
+ emit log_named_uint (" Value b", b);
+ emit log_named_uint (" Max Delta", maxDelta);
+ emit log_named_uint (" Delta", dt);
+ fail();
+ }
+ }
+ }
+
+ function assertApproxLeAbs(uint a, uint b, uint maxDelta) internal {
+ if (!(a <= b)) {
+ uint dt = a - b;
+ if (dt > maxDelta) {
+ emit log ("Error: a <=~ b not satisfied [uint]");
+ emit log_named_uint (" Value a", a);
+ emit log_named_uint (" Value b", b);
+ emit log_named_uint (" Max Delta", maxDelta);
+ emit log_named_uint (" Delta", dt);
+ fail();
+ }
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.test.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.test.sol
new file mode 100644
index 000000000..6254a0547
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.test.sol
@@ -0,0 +1,349 @@
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity >=0.8.0 <0.9.0;
+
+import "./ERC4626.prop.sol";
+
+interface IMockERC20 is IERC20 {
+ function mint(address to, uint value) external;
+ function burn(address from, uint value) external;
+}
+
+abstract contract ERC4626Test is ERC4626Prop {
+ function setUp() public virtual;
+
+ uint constant N = 4;
+
+ struct Init {
+ address[N] user;
+ uint[N] share;
+ uint[N] asset;
+ int yield;
+ }
+
+ // setup initial vault state as follows:
+ //
+ // totalAssets == sum(init.share) + init.yield
+ // totalShares == sum(init.share)
+ //
+ // init.user[i]'s assets == init.asset[i]
+ // init.user[i]'s shares == init.share[i]
+ function setUpVault(Init memory init) public virtual {
+ // setup initial shares and assets for individual users
+ for (uint i = 0; i < N; i++) {
+ address user = init.user[i];
+ vm.assume(_isEOA(user));
+ // shares
+ uint shares = init.share[i];
+ try IMockERC20(_underlying_).mint(user, shares) {} catch { vm.assume(false); }
+ _approve(_underlying_, user, _vault_, shares);
+ vm.prank(user); try IERC4626(_vault_).deposit(shares, user) {} catch { vm.assume(false); }
+ // assets
+ uint assets = init.asset[i];
+ try IMockERC20(_underlying_).mint(user, assets) {} catch { vm.assume(false); }
+ }
+
+ // setup initial yield for vault
+ setUpYield(init);
+ }
+
+ // setup initial yield
+ function setUpYield(Init memory init) public virtual {
+ if (init.yield >= 0) { // gain
+ uint gain = uint(init.yield);
+ try IMockERC20(_underlying_).mint(_vault_, gain) {} catch { vm.assume(false); } // this can be replaced by calling yield generating functions if provided by the vault
+ } else { // loss
+ vm.assume(init.yield > type(int).min); // avoid overflow in conversion
+ uint loss = uint(-1 * init.yield);
+ try IMockERC20(_underlying_).burn(_vault_, loss) {} catch { vm.assume(false); } // this can be replaced by calling yield generating functions if provided by the vault
+ }
+ }
+
+ //
+ // asset
+ //
+
+ function test_asset(Init memory init) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ prop_asset(caller);
+ }
+
+ function test_totalAssets(Init memory init) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ prop_totalAssets(caller);
+ }
+
+ //
+ // convert
+ //
+
+ function test_convertToShares(Init memory init, uint assets) public virtual {
+ setUpVault(init);
+ address caller1 = init.user[0];
+ address caller2 = init.user[1];
+ prop_convertToShares(caller1, caller2, assets);
+ }
+
+ function test_convertToAssets(Init memory init, uint shares) public virtual {
+ setUpVault(init);
+ address caller1 = init.user[0];
+ address caller2 = init.user[1];
+ prop_convertToAssets(caller1, caller2, shares);
+ }
+
+ //
+ // deposit
+ //
+
+ function test_maxDeposit(Init memory init) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ prop_maxDeposit(caller, receiver);
+ }
+
+ function test_previewDeposit(Init memory init, uint assets) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ address other = init.user[2];
+ assets = bound(assets, 0, _max_deposit(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_previewDeposit(caller, receiver, other, assets);
+ }
+
+ function test_deposit(Init memory init, uint assets, uint allowance) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ assets = bound(assets, 0, _max_deposit(caller));
+ _approve(_underlying_, caller, _vault_, allowance);
+ prop_deposit(caller, receiver, assets);
+ }
+
+ //
+ // mint
+ //
+
+ function test_maxMint(Init memory init) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ prop_maxMint(caller, receiver);
+ }
+
+ function test_previewMint(Init memory init, uint shares) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ address other = init.user[2];
+ shares = bound(shares, 0, _max_mint(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_previewMint(caller, receiver, other, shares);
+ }
+
+ function test_mint(Init memory init, uint shares, uint allowance) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ shares = bound(shares, 0, _max_mint(caller));
+ _approve(_underlying_, caller, _vault_, allowance);
+ prop_mint(caller, receiver, shares);
+ }
+
+ //
+ // withdraw
+ //
+
+ function test_maxWithdraw(Init memory init) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address owner = init.user[1];
+ prop_maxWithdraw(caller, owner);
+ }
+
+ function test_previewWithdraw(Init memory init, uint assets) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ address owner = init.user[2];
+ address other = init.user[3];
+ assets = bound(assets, 0, _max_withdraw(owner));
+ _approve(_vault_, owner, caller, type(uint).max);
+ prop_previewWithdraw(caller, receiver, owner, other, assets);
+ }
+
+ function test_withdraw(Init memory init, uint assets, uint allowance) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ address owner = init.user[2];
+ assets = bound(assets, 0, _max_withdraw(owner));
+ _approve(_vault_, owner, caller, allowance);
+ prop_withdraw(caller, receiver, owner, assets);
+ }
+
+ function testFail_withdraw(Init memory init, uint assets) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ address owner = init.user[2];
+ assets = bound(assets, 0, _max_withdraw(owner));
+ vm.assume(caller != owner);
+ vm.assume(assets > 0);
+ _approve(_vault_, owner, caller, 0);
+ vm.prank(caller); uint shares = IERC4626(_vault_).withdraw(assets, receiver, owner);
+ assertGt(shares, 0); // this assert is expected to fail
+ }
+
+ //
+ // redeem
+ //
+
+ function test_maxRedeem(Init memory init) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address owner = init.user[1];
+ prop_maxRedeem(caller, owner);
+ }
+
+ function test_previewRedeem(Init memory init, uint shares) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ address owner = init.user[2];
+ address other = init.user[3];
+ shares = bound(shares, 0, _max_redeem(owner));
+ _approve(_vault_, owner, caller, type(uint).max);
+ prop_previewRedeem(caller, receiver, owner, other, shares);
+ }
+
+ function test_redeem(Init memory init, uint shares, uint allowance) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ address owner = init.user[2];
+ shares = bound(shares, 0, _max_redeem(owner));
+ _approve(_vault_, owner, caller, allowance);
+ prop_redeem(caller, receiver, owner, shares);
+ }
+
+ function testFail_redeem(Init memory init, uint shares) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ address receiver = init.user[1];
+ address owner = init.user[2];
+ shares = bound(shares, 0, _max_redeem(owner));
+ vm.assume(caller != owner);
+ vm.assume(shares > 0);
+ _approve(_vault_, owner, caller, 0);
+ vm.prank(caller); IERC4626(_vault_).redeem(shares, receiver, owner);
+ }
+
+ //
+ // round trip tests
+ //
+
+ function test_RT_deposit_redeem(Init memory init, uint assets) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ assets = bound(assets, 0, _max_deposit(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_RT_deposit_redeem(caller, assets);
+ }
+
+ function test_RT_deposit_withdraw(Init memory init, uint assets) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ assets = bound(assets, 0, _max_deposit(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_RT_deposit_withdraw(caller, assets);
+ }
+
+ function test_RT_redeem_deposit(Init memory init, uint shares) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ shares = bound(shares, 0, _max_redeem(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_RT_redeem_deposit(caller, shares);
+ }
+
+ function test_RT_redeem_mint(Init memory init, uint shares) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ shares = bound(shares, 0, _max_redeem(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_RT_redeem_mint(caller, shares);
+ }
+
+ function test_RT_mint_withdraw(Init memory init, uint shares) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ shares = bound(shares, 0, _max_mint(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_RT_mint_withdraw(caller, shares);
+ }
+
+ function test_RT_mint_redeem(Init memory init, uint shares) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ shares = bound(shares, 0, _max_mint(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_RT_mint_redeem(caller, shares);
+ }
+
+ function test_RT_withdraw_mint(Init memory init, uint assets) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ assets = bound(assets, 0, _max_withdraw(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_RT_withdraw_mint(caller, assets);
+ }
+
+ function test_RT_withdraw_deposit(Init memory init, uint assets) public virtual {
+ setUpVault(init);
+ address caller = init.user[0];
+ assets = bound(assets, 0, _max_withdraw(caller));
+ _approve(_underlying_, caller, _vault_, type(uint).max);
+ prop_RT_withdraw_deposit(caller, assets);
+ }
+
+ //
+ // utils
+ //
+
+ function _isContract(address account) internal view returns (bool) { return account.code.length > 0; }
+ function _isEOA (address account) internal view returns (bool) { return account.code.length == 0; }
+
+ function _approve(address token, address owner, address spender, uint amount) internal {
+ vm.prank(owner); _safeApprove(token, spender, 0);
+ vm.prank(owner); _safeApprove(token, spender, amount);
+ }
+
+ function _safeApprove(address token, address spender, uint amount) internal {
+ (bool success, bytes memory retdata) = token.call(abi.encodeWithSelector(IERC20.approve.selector, spender, amount));
+ vm.assume(success);
+ if (retdata.length > 0) vm.assume(abi.decode(retdata, (bool)));
+ }
+
+ function _max_deposit(address from) internal virtual returns (uint) {
+ if (_unlimitedAmount) return type(uint).max;
+ return IERC20(_underlying_).balanceOf(from);
+ }
+
+ function _max_mint(address from) internal virtual returns (uint) {
+ if (_unlimitedAmount) return type(uint).max;
+ return vault_convertToShares(IERC20(_underlying_).balanceOf(from));
+ }
+
+ function _max_withdraw(address from) internal virtual returns (uint) {
+ if (_unlimitedAmount) return type(uint).max;
+ return vault_convertToAssets(IERC20(_vault_).balanceOf(from)); // may be different from maxWithdraw(from)
+ }
+
+ function _max_redeem(address from) internal virtual returns (uint) {
+ if (_unlimitedAmount) return type(uint).max;
+ return IERC20(_vault_).balanceOf(from); // may be different from maxRedeem(from)
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE
new file mode 100644
index 000000000..0ad25db4b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/README.md b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/README.md
new file mode 100644
index 000000000..c4731fc67
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/README.md
@@ -0,0 +1,121 @@
+# ERC4626 Property Tests
+
+Foundry (dapptools-style) property-based tests for [ERC4626] standard conformance.
+
+[ERC4626]: https://eips.ethereum.org/EIPS/eip-4626
+
+You can read our post on "_[Generalized property tests for ERC4626 vaults][post]_."
+
+[post]: https://a16zcrypto.com/generalized-property-tests-for-erc4626-vaults
+
+## Overview
+
+#### What is it?
+
+- Test suites for checking if the given ERC4626 implementation satisfies the **standard requirements**.
+- Dapptools-style **property-based tests** for fuzzing or symbolic execution testing.
+- Tests that are **independent** from implementation details, thus applicable for any ERC4626 vaults.
+
+#### What isn’t it?
+
+- It does NOT test implementation-specific details, e.g., how to generate and distribute yields, how to compute the share price, etc.
+
+#### Testing properties:
+
+- **Round-trip properties**: no one can make a free profit by depositing and immediately withdrawing back and forth.
+
+- **Functional correctness**: the `deposit()`, `mint()`, `withdraw()`, and `redeem()` functions update the balance and allowance properly.
+
+- The `preview{Deposit,Redeem}()` functions **MUST NOT over-estimate** the exact amount.[^1]
+
+[^1]: That is, the `deposit()` and `redeem()` functions “MUST return the same or more amounts as their preview function if called in the same transaction.”
+
+- The `preview{Mint,Withdraw}()` functions **MUST NOT under-estimate** the exact amount.[^2]
+
+[^2]: That is, the `mint()` and `withdraw()` functions “MUST return the same or fewer amounts as their preview function if called in the same transaction.”
+
+- The `convertTo{Shares,Assets}` functions “**MUST NOT show any variations** depending on the caller.”
+
+- The `asset()`, `totalAssets()`, and `max{Deposit,Mint,Withdraw,Redeem}()` functions “**MUST NOT revert**.”
+
+## Usage
+
+**Step 0**: Install [foundry] and add [forge-std] in your vault repo:
+
+```bash
+$ curl -L https://foundry.paradigm.xyz | bash
+
+$ cd /path/to/your-erc4626-vault
+$ forge install foundry-rs/forge-std
+```
+
+[foundry]: https://getfoundry.sh/
+[forge-std]: https://github.com/foundry-rs/forge-std
+
+**Step 1**: Add this [erc4626-tests] as a dependency to your vault:
+
+```bash
+$ cd /path/to/your-erc4626-vault
+$ forge install a16z/erc4626-tests
+```
+
+[erc4626-tests]: https://github.com/a16z/erc4626-tests
+
+**Step 2**: Extend the abstract test contract [`ERC4626Test`](ERC4626.test.sol) with your own custom vault setup method, for example:
+
+```solidity
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity >=0.8.0 <0.9.0;
+
+import 'erc4626-tests/ERC4626.test.sol';
+
+import { ERC20Mock } from '/path/to/mocks/ERC20Mock.sol';
+import { ERC4626Mock } from '/path/to/mocks/ERC4626Mock.sol';
+
+contract ERC4626StdTest is ERC4626Test {
+ function setUp() public override {
+ _underlying_ = address(new ERC20Mock('Mock ERC20', 'MERC20', 18));
+ _vault_ = address(new ERC4626Mock(ERC20Mock(__underlying__), 'Mock ERC4626', 'MERC4626'));
+ _delta_ = 0;
+ _vaultMayBeEmpty = false;
+ _unlimitedAmount = false;
+ }
+}
+```
+
+Specifically, set the state variables as follows:
+
+- `_vault_`: the address of your ERC4626 vault.
+- `_underlying_`: the address of the underlying asset of your vault. Note that the default `setupVault()` and `setupYield()` methods of `ERC4626Test` assume that it implements `mint(address to, uint value)` and `burn(address from, uint value)`. You can override the setup methods with your own if such `mint()` and `burn()` are not implemented.
+- `_delta_`: the maximum approximation error size to be passed to [`assertApproxEqAbs()`]. It must be given as an absolute value (not a percentage) in the smallest unit (e.g., Wei or Satoshi). Note that all the tests are expected to pass with `__delta__ == 0` as long as your vault follows the [preferred rounding direction] as specified in the standard. If your vault doesn't follow the preferred rounding direction, you can set `__delta__` to a reasonable size of rounding errors where the adversarial profit of exploiting such rounding errors stays sufficiently small compared to the gas cost. (You can read our [post] for more about the adversarial profit.)
+- `_vaultMayBeEmpty`: when set to false, fuzz inputs that empties the vault are ignored.
+- `_unlimitedAmount`: when set to false, fuzz inputs are restricted to the currently available amount from the caller. Limiting the amount can speed up fuzzing, but may miss some edge cases.
+
+[`assertApproxEqAbs()`]: https://book.getfoundry.sh/reference/forge-std/assertApproxEqAbs
+[preferred rounding direction]: https://eips.ethereum.org/EIPS/eip-4626#security-considerations
+
+**Step 3**: Run `forge test`
+
+```
+$ forge test
+```
+
+## Examples
+
+Below are examples of adding these property tests to existing ERC4626 vaults:
+
+- [OpenZeppelin ERC4626] [[diff](https://github.com/daejunpark/openzeppelin-contracts/pull/1/files)]
+- [Solmate ERC4626] [[diff](https://github.com/daejunpark/solmate/pull/1/files)]
+- [Revenue Distribution Token] [[diff](https://github.com/daejunpark/revenue-distribution-token/pull/1/files)]
+- [Yield Daddy ERC4626 wrappers] [[diff](https://github.com/daejunpark/yield-daddy/pull/1/files)][^bug]
+
+[OpenZeppelin ERC4626]: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a1948250ab8c441f6d327a65754cb20d2b1b4554/contracts/token/ERC20/extensions/ERC4626.sol
+[Solmate ERC4626]: https://github.com/transmissions11/solmate/blob/c2594bf4635ad773a8f4763e20b7e79582e41535/src/mixins/ERC4626.sol
+[Revenue Distribution Token]: https://github.com/maple-labs/revenue-distribution-token/blob/be9592fd72bfa7142a217507f2d5500a7856329e/contracts/RevenueDistributionToken.sol
+[Yield Daddy ERC4626 wrappers]: https://github.com/timeless-fi/yield-daddy
+
+[^bug]: Our property tests indeed revealed an [issue](https://github.com/timeless-fi/yield-daddy/issues/7) in their eToken testing mock contract. The tests passed after it is [fixed](https://github.com/daejunpark/yield-daddy/commit/721cf4bd766805fd409455434aa5fd1a9b2df25c).
+
+## Disclaimer
+
+_These smart contracts are being provided as is. No guarantee, representation or warranty is being made, express or implied, as to the safety or correctness of the user interface or the smart contracts. They have not been audited and as such there can be no assurance they will work as intended, and users may experience delays, failures, errors, omissions or loss of transmitted information. THE SMART CONTRACTS CONTAINED HEREIN ARE FURNISHED AS IS, WHERE IS, WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF MERCHANTABILITY, NON-INFRINGEMENT OR FITNESS FOR ANY PARTICULAR PURPOSE. Further, use of any of these smart contracts may be restricted or prohibited under applicable law, including securities laws, and it is therefore strongly advised for you to contact a reputable attorney in any jurisdiction where these smart contracts may be accessible for any questions or concerns with respect thereto. Further, no information provided in this repo should be construed as investment advice or legal advice for any particular facts or circumstances, and is not meant to replace competent counsel. a16z is not liable for any use of the foregoing, and users should proceed with caution and use at their own risk. See a16z.com/disclosures for more info._
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.gitattributes b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.gitattributes
new file mode 100644
index 000000000..27042d458
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.gitattributes
@@ -0,0 +1 @@
+src/Vm.sol linguist-generated
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml
new file mode 100644
index 000000000..2d68e91fb
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml
@@ -0,0 +1,128 @@
+name: CI
+
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches:
+ - master
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Print forge version
+ run: forge --version
+
+ # Backwards compatibility checks:
+ # - the oldest and newest version of each supported minor version
+ # - versions with specific issues
+ - name: Check compatibility with latest
+ if: always()
+ run: |
+ output=$(forge build --skip test)
+ if echo "$output" | grep -q "Warning"; then
+ echo "$output"
+ exit 1
+ fi
+
+ - name: Check compatibility with 0.8.0
+ if: always()
+ run: |
+ output=$(forge build --skip test --use solc:0.8.0)
+ if echo "$output" | grep -q "Warning"; then
+ echo "$output"
+ exit 1
+ fi
+
+ - name: Check compatibility with 0.7.6
+ if: always()
+ run: |
+ output=$(forge build --skip test --use solc:0.7.6)
+ if echo "$output" | grep -q "Warning"; then
+ echo "$output"
+ exit 1
+ fi
+
+ - name: Check compatibility with 0.7.0
+ if: always()
+ run: |
+ output=$(forge build --skip test --use solc:0.7.0)
+ if echo "$output" | grep -q "Warning"; then
+ echo "$output"
+ exit 1
+ fi
+
+ - name: Check compatibility with 0.6.12
+ if: always()
+ run: |
+ output=$(forge build --skip test --use solc:0.6.12)
+ if echo "$output" | grep -q "Warning"; then
+ echo "$output"
+ exit 1
+ fi
+
+ - name: Check compatibility with 0.6.2
+ if: always()
+ run: |
+ output=$(forge build --skip test --use solc:0.6.2)
+ if echo "$output" | grep -q "Warning"; then
+ echo "$output"
+ exit 1
+ fi
+
+ # via-ir compilation time checks.
+ - name: Measure compilation time of Test with 0.8.17 --via-ir
+ if: always()
+ run: forge build --skip test --contracts test/compilation/CompilationTest.sol --use solc:0.8.17 --via-ir
+
+ - name: Measure compilation time of TestBase with 0.8.17 --via-ir
+ if: always()
+ run: forge build --skip test --contracts test/compilation/CompilationTestBase.sol --use solc:0.8.17 --via-ir
+
+ - name: Measure compilation time of Script with 0.8.17 --via-ir
+ if: always()
+ run: forge build --skip test --contracts test/compilation/CompilationScript.sol --use solc:0.8.17 --via-ir
+
+ - name: Measure compilation time of ScriptBase with 0.8.17 --via-ir
+ if: always()
+ run: forge build --skip test --contracts test/compilation/CompilationScriptBase.sol --use solc:0.8.17 --via-ir
+
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Print forge version
+ run: forge --version
+
+ - name: Run tests
+ run: forge test -vvv
+
+ fmt:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Print forge version
+ run: forge --version
+
+ - name: Check formatting
+ run: forge fmt --check
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/sync.yml b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/sync.yml
new file mode 100644
index 000000000..9b170f0b7
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/sync.yml
@@ -0,0 +1,31 @@
+name: Sync Release Branch
+
+on:
+ release:
+ types:
+ - created
+
+jobs:
+ sync-release-branch:
+ runs-on: ubuntu-latest
+ if: startsWith(github.event.release.tag_name, 'v1')
+ steps:
+ - name: Check out the repo
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ ref: v1
+
+ # The email is derived from the bots user id,
+ # found here: https://api.github.com/users/github-actions%5Bbot%5D
+ - name: Configure Git
+ run: |
+ git config user.name github-actions[bot]
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+
+ - name: Sync Release Branch
+ run: |
+ git fetch --tags
+ git checkout v1
+ git reset --hard ${GITHUB_REF}
+ git push --force
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE
new file mode 100644
index 000000000..cf01a499f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE
@@ -0,0 +1,203 @@
+Copyright Contributors to Forge Standard Library
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT
new file mode 100644
index 000000000..28f98304a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright Contributors to Forge Standard Library
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.R
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/README.md b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/README.md
new file mode 100644
index 000000000..230aaf263
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/README.md
@@ -0,0 +1,235 @@
+# Forge Standard Library • [](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml)
+
+Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes.
+
+**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://book.getfoundry.sh/forge/forge-std.html).**
+
+## Install
+
+```bash
+forge install foundry-rs/forge-std
+```
+
+## Contracts
+
+### stdError
+
+This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler builtin errors.
+
+See the contract itself for all error codes.
+
+#### Example usage
+
+```solidity
+import 'forge-std/Test.sol';
+
+contract TestContract is Test {
+ ErrorsTest test;
+
+ function setUp() public {
+ test = new ErrorsTest();
+ }
+
+ function testExpectArithmetic() public {
+ vm.expectRevert(stdError.arithmeticError);
+ test.arithmeticError(10);
+ }
+}
+
+contract ErrorsTest {
+ function arithmeticError(uint256 a) public {
+ uint256 a = a - 100;
+ }
+}
+```
+
+### stdStorage
+
+This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can _always_ find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`).
+
+This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth.
+
+I.e.:
+
+```solidity
+struct T {
+ // depth 0
+ uint256 a;
+ // depth 1
+ uint256 b;
+}
+```
+
+#### Example usage
+
+```solidity
+import 'forge-std/Test.sol';
+
+contract TestContract is Test {
+ using stdStorage for StdStorage;
+
+ Storage test;
+
+ function setUp() public {
+ test = new Storage();
+ }
+
+ function testFindExists() public {
+ // Lets say we want to find the slot for the public
+ // variable `exists`. We just pass in the function selector
+ // to the `find` command
+ uint256 slot = stdstore.target(address(test)).sig('exists()').find();
+ assertEq(slot, 0);
+ }
+
+ function testWriteExists() public {
+ // Lets say we want to write to the slot for the public
+ // variable `exists`. We just pass in the function selector
+ // to the `checked_write` command
+ stdstore.target(address(test)).sig('exists()').checked_write(100);
+ assertEq(test.exists(), 100);
+ }
+
+ // It supports arbitrary storage layouts, like assembly based storage locations
+ function testFindHidden() public {
+ // `hidden` is a random hash of a bytes, iteration through slots would
+ // not find it. Our mechanism does
+ // Also, you can use the selector instead of a string
+ uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find();
+ assertEq(slot, uint256(keccak256('my.random.var')));
+ }
+
+ // If targeting a mapping, you have to pass in the keys necessary to perform the find
+ // i.e.:
+ function testFindMapping() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find();
+ // in the `Storage` constructor, we wrote that this address' value was 1 in the map
+ // so when we load the slot, we expect it to be 1
+ assertEq(uint(vm.load(address(test), bytes32(slot))), 1);
+ }
+
+ // If the target is a struct, you can specify the field depth:
+ function testFindStruct() public {
+ // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc.
+ uint256 slot_for_a_field = stdstore.target(address(test)).sig(test.basicStruct.selector).depth(0).find();
+
+ uint256 slot_for_b_field = stdstore.target(address(test)).sig(test.basicStruct.selector).depth(1).find();
+
+ assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1);
+ assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2);
+ }
+}
+
+// A complex storage contract
+contract Storage {
+ struct UnpackedStruct {
+ uint256 a;
+ uint256 b;
+ }
+
+ constructor() {
+ map_addr[msg.sender] = 1;
+ }
+
+ uint256 public exists = 1;
+ mapping(address => uint256) public map_addr;
+ // mapping(address => Packed) public map_packed;
+ mapping(address => UnpackedStruct) public map_struct;
+ mapping(address => mapping(address => uint256)) public deep_map;
+ mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct;
+ UnpackedStruct public basicStruct = UnpackedStruct({ a: 1, b: 2 });
+
+ function hidden() public view returns (bytes32 t) {
+ // an extremely hidden storage slot
+ bytes32 slot = keccak256('my.random.var');
+ assembly {
+ t := sload(slot)
+ }
+ }
+}
+```
+
+### stdCheats
+
+This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for addresses that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you.
+
+#### Example usage:
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import 'forge-std/Test.sol';
+
+// Inherit the stdCheats
+contract StdCheatsTest is Test {
+ Bar test;
+ function setUp() public {
+ test = new Bar();
+ }
+
+ function testHoax() public {
+ // we call `hoax`, which gives the target address
+ // eth and then calls `prank`
+ hoax(address(1337));
+ test.bar{ value: 100 }(address(1337));
+
+ // overloaded to allow you to specify how much eth to
+ // initialize the address with
+ hoax(address(1337), 1);
+ test.bar{ value: 1 }(address(1337));
+ }
+
+ function testStartHoax() public {
+ // we call `startHoax`, which gives the target address
+ // eth and then calls `startPrank`
+ //
+ // it is also overloaded so that you can specify an eth amount
+ startHoax(address(1337));
+ test.bar{ value: 100 }(address(1337));
+ test.bar{ value: 100 }(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+}
+
+contract Bar {
+ function bar(address expectedSender) public payable {
+ require(msg.sender == expectedSender, '!prank');
+ }
+}
+```
+
+### Std Assertions
+
+Contains various assertions.
+
+### `console.log`
+
+Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log).
+It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces.
+
+```solidity
+// import it indirectly via Test.sol
+import "forge-std/Test.sol";
+// or directly import it
+import "forge-std/console2.sol";
+...
+console2.log(someValue);
+```
+
+If you need compatibility with Hardhat, you must use the standard `console.sol` instead.
+Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces.
+
+```solidity
+// import it indirectly via Test.sol
+import "forge-std/Test.sol";
+// or directly import it
+import "forge-std/console.sol";
+...
+console.log(someValue);
+```
+
+## License
+
+Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/foundry.toml b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/foundry.toml
new file mode 100644
index 000000000..2bc66fa77
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/foundry.toml
@@ -0,0 +1,21 @@
+[profile.default]
+fs_permissions = [{ access = "read-write", path = "./"}]
+
+[rpc_endpoints]
+# The RPC URLs are modified versions of the default for testing initialization.
+mainnet = "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX" # Different API key.
+optimism_sepolia = "https://sepolia.optimism.io/" # Adds a trailing slash.
+arbitrum_one_sepolia = "https://sepolia-rollup.arbitrum.io/rpc/" # Adds a trailing slash.
+needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}"
+
+[fmt]
+# These are all the `forge fmt` defaults.
+line_length = 120
+tab_width = 4
+bracket_spacing = false
+int_types = 'long'
+multiline_func_header = 'attributes_first'
+quote_style = 'double'
+number_underscore = 'preserve'
+single_line_statement_blocks = 'preserve'
+ignore = ["src/console.sol", "src/console2.sol"]
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/package.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/package.json
new file mode 100644
index 000000000..9bc3d242c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "forge-std",
+ "version": "1.9.3",
+ "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.",
+ "homepage": "https://book.getfoundry.sh/forge/forge-std",
+ "bugs": "https://github.com/foundry-rs/forge-std/issues",
+ "license": "(Apache-2.0 OR MIT)",
+ "author": "Contributors to Forge Standard Library",
+ "files": [
+ "src/**/*"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/foundry-rs/forge-std.git"
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py
new file mode 100644
index 000000000..f0537db9b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py
@@ -0,0 +1,635 @@
+#!/usr/bin/env python3
+
+import copy
+import json
+import re
+import subprocess
+from enum import Enum as PyEnum
+from typing import Callable
+from urllib import request
+
+VoidFn = Callable[[], None]
+
+CHEATCODES_JSON_URL = "https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json"
+OUT_PATH = "src/Vm.sol"
+
+VM_SAFE_DOC = """\
+/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may
+/// result in Script simulations differing from on-chain execution. It is recommended to only use
+/// these cheats in scripts.
+"""
+
+VM_DOC = """\
+/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used
+/// in tests, but it is not recommended to use these cheats in scripts.
+"""
+
+
+def main():
+ json_str = request.urlopen(CHEATCODES_JSON_URL).read().decode("utf-8")
+ contract = Cheatcodes.from_json(json_str)
+
+ ccs = contract.cheatcodes
+ ccs = list(filter(lambda cc: cc.status not in ["experimental", "internal"], ccs))
+ ccs.sort(key=lambda cc: cc.func.id)
+
+ safe = list(filter(lambda cc: cc.safety == "safe", ccs))
+ safe.sort(key=CmpCheatcode)
+ unsafe = list(filter(lambda cc: cc.safety == "unsafe", ccs))
+ unsafe.sort(key=CmpCheatcode)
+ assert len(safe) + len(unsafe) == len(ccs)
+
+ prefix_with_group_headers(safe)
+ prefix_with_group_headers(unsafe)
+
+ out = ""
+
+ out += "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n"
+
+ pp = CheatcodesPrinter(
+ spdx_identifier="MIT OR Apache-2.0",
+ solidity_requirement=">=0.6.2 <0.9.0",
+ abicoder_pragma=True,
+ )
+ pp.p_prelude()
+ pp.prelude = False
+ out += pp.finish()
+
+ out += "\n\n"
+ out += VM_SAFE_DOC
+ vm_safe = Cheatcodes(
+ # TODO: Custom errors were introduced in 0.8.4
+ errors=[], # contract.errors
+ events=contract.events,
+ enums=contract.enums,
+ structs=contract.structs,
+ cheatcodes=safe,
+ )
+ pp.p_contract(vm_safe, "VmSafe")
+ out += pp.finish()
+
+ out += "\n\n"
+ out += VM_DOC
+ vm_unsafe = Cheatcodes(
+ errors=[],
+ events=[],
+ enums=[],
+ structs=[],
+ cheatcodes=unsafe,
+ )
+ pp.p_contract(vm_unsafe, "Vm", "VmSafe")
+ out += pp.finish()
+
+ # Compatibility with <0.8.0
+ def memory_to_calldata(m: re.Match) -> str:
+ return " calldata " + m.group(1)
+
+ out = re.sub(r" memory (.*returns)", memory_to_calldata, out)
+
+ with open(OUT_PATH, "w") as f:
+ f.write(out)
+
+ forge_fmt = ["forge", "fmt", OUT_PATH]
+ res = subprocess.run(forge_fmt)
+ assert res.returncode == 0, f"command failed: {forge_fmt}"
+
+ print(f"Wrote to {OUT_PATH}")
+
+
+class CmpCheatcode:
+ cheatcode: "Cheatcode"
+
+ def __init__(self, cheatcode: "Cheatcode"):
+ self.cheatcode = cheatcode
+
+ def __lt__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) < 0
+
+ def __eq__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) == 0
+
+ def __gt__(self, other: "CmpCheatcode") -> bool:
+ return cmp_cheatcode(self.cheatcode, other.cheatcode) > 0
+
+
+def cmp_cheatcode(a: "Cheatcode", b: "Cheatcode") -> int:
+ if a.group != b.group:
+ return -1 if a.group < b.group else 1
+ if a.status != b.status:
+ return -1 if a.status < b.status else 1
+ if a.safety != b.safety:
+ return -1 if a.safety < b.safety else 1
+ if a.func.id != b.func.id:
+ return -1 if a.func.id < b.func.id else 1
+ return 0
+
+
+# HACK: A way to add group header comments without having to modify printer code
+def prefix_with_group_headers(cheats: list["Cheatcode"]):
+ s = set()
+ for i, cheat in enumerate(cheats):
+ if cheat.group in s:
+ continue
+
+ s.add(cheat.group)
+
+ c = copy.deepcopy(cheat)
+ c.func.description = ""
+ c.func.declaration = f"// ======== {group(c.group)} ========"
+ cheats.insert(i, c)
+ return cheats
+
+
+def group(s: str) -> str:
+ if s == "evm":
+ return "EVM"
+ if s == "json":
+ return "JSON"
+ return s[0].upper() + s[1:]
+
+
+class Visibility(PyEnum):
+ EXTERNAL: str = "external"
+ PUBLIC: str = "public"
+ INTERNAL: str = "internal"
+ PRIVATE: str = "private"
+
+ def __str__(self):
+ return self.value
+
+
+class Mutability(PyEnum):
+ PURE: str = "pure"
+ VIEW: str = "view"
+ NONE: str = ""
+
+ def __str__(self):
+ return self.value
+
+
+class Function:
+ id: str
+ description: str
+ declaration: str
+ visibility: Visibility
+ mutability: Mutability
+ signature: str
+ selector: str
+ selector_bytes: bytes
+
+ def __init__(
+ self,
+ id: str,
+ description: str,
+ declaration: str,
+ visibility: Visibility,
+ mutability: Mutability,
+ signature: str,
+ selector: str,
+ selector_bytes: bytes,
+ ):
+ self.id = id
+ self.description = description
+ self.declaration = declaration
+ self.visibility = visibility
+ self.mutability = mutability
+ self.signature = signature
+ self.selector = selector
+ self.selector_bytes = selector_bytes
+
+ @staticmethod
+ def from_dict(d: dict) -> "Function":
+ return Function(
+ d["id"],
+ d["description"],
+ d["declaration"],
+ Visibility(d["visibility"]),
+ Mutability(d["mutability"]),
+ d["signature"],
+ d["selector"],
+ bytes(d["selectorBytes"]),
+ )
+
+
+class Cheatcode:
+ func: Function
+ group: str
+ status: str
+ safety: str
+
+ def __init__(self, func: Function, group: str, status: str, safety: str):
+ self.func = func
+ self.group = group
+ self.status = status
+ self.safety = safety
+
+ @staticmethod
+ def from_dict(d: dict) -> "Cheatcode":
+ return Cheatcode(
+ Function.from_dict(d["func"]),
+ str(d["group"]),
+ str(d["status"]),
+ str(d["safety"]),
+ )
+
+
+class Error:
+ name: str
+ description: str
+ declaration: str
+
+ def __init__(self, name: str, description: str, declaration: str):
+ self.name = name
+ self.description = description
+ self.declaration = declaration
+
+ @staticmethod
+ def from_dict(d: dict) -> "Error":
+ return Error(**d)
+
+
+class Event:
+ name: str
+ description: str
+ declaration: str
+
+ def __init__(self, name: str, description: str, declaration: str):
+ self.name = name
+ self.description = description
+ self.declaration = declaration
+
+ @staticmethod
+ def from_dict(d: dict) -> "Event":
+ return Event(**d)
+
+
+class EnumVariant:
+ name: str
+ description: str
+
+ def __init__(self, name: str, description: str):
+ self.name = name
+ self.description = description
+
+
+class Enum:
+ name: str
+ description: str
+ variants: list[EnumVariant]
+
+ def __init__(self, name: str, description: str, variants: list[EnumVariant]):
+ self.name = name
+ self.description = description
+ self.variants = variants
+
+ @staticmethod
+ def from_dict(d: dict) -> "Enum":
+ return Enum(
+ d["name"],
+ d["description"],
+ list(map(lambda v: EnumVariant(**v), d["variants"])),
+ )
+
+
+class StructField:
+ name: str
+ ty: str
+ description: str
+
+ def __init__(self, name: str, ty: str, description: str):
+ self.name = name
+ self.ty = ty
+ self.description = description
+
+
+class Struct:
+ name: str
+ description: str
+ fields: list[StructField]
+
+ def __init__(self, name: str, description: str, fields: list[StructField]):
+ self.name = name
+ self.description = description
+ self.fields = fields
+
+ @staticmethod
+ def from_dict(d: dict) -> "Struct":
+ return Struct(
+ d["name"],
+ d["description"],
+ list(map(lambda f: StructField(**f), d["fields"])),
+ )
+
+
+class Cheatcodes:
+ errors: list[Error]
+ events: list[Event]
+ enums: list[Enum]
+ structs: list[Struct]
+ cheatcodes: list[Cheatcode]
+
+ def __init__(
+ self,
+ errors: list[Error],
+ events: list[Event],
+ enums: list[Enum],
+ structs: list[Struct],
+ cheatcodes: list[Cheatcode],
+ ):
+ self.errors = errors
+ self.events = events
+ self.enums = enums
+ self.structs = structs
+ self.cheatcodes = cheatcodes
+
+ @staticmethod
+ def from_dict(d: dict) -> "Cheatcodes":
+ return Cheatcodes(
+ errors=[Error.from_dict(e) for e in d["errors"]],
+ events=[Event.from_dict(e) for e in d["events"]],
+ enums=[Enum.from_dict(e) for e in d["enums"]],
+ structs=[Struct.from_dict(e) for e in d["structs"]],
+ cheatcodes=[Cheatcode.from_dict(e) for e in d["cheatcodes"]],
+ )
+
+ @staticmethod
+ def from_json(s) -> "Cheatcodes":
+ return Cheatcodes.from_dict(json.loads(s))
+
+ @staticmethod
+ def from_json_file(file_path: str) -> "Cheatcodes":
+ with open(file_path, "r") as f:
+ return Cheatcodes.from_dict(json.load(f))
+
+
+class Item(PyEnum):
+ ERROR: str = "error"
+ EVENT: str = "event"
+ ENUM: str = "enum"
+ STRUCT: str = "struct"
+ FUNCTION: str = "function"
+
+
+class ItemOrder:
+ _list: list[Item]
+
+ def __init__(self, list: list[Item]) -> None:
+ assert len(list) <= len(Item), "list must not contain more items than Item"
+ assert len(list) == len(set(list)), "list must not contain duplicates"
+ self._list = list
+ pass
+
+ def get_list(self) -> list[Item]:
+ return self._list
+
+ @staticmethod
+ def default() -> "ItemOrder":
+ return ItemOrder(
+ [
+ Item.ERROR,
+ Item.EVENT,
+ Item.ENUM,
+ Item.STRUCT,
+ Item.FUNCTION,
+ ]
+ )
+
+
+class CheatcodesPrinter:
+ buffer: str
+
+ prelude: bool
+ spdx_identifier: str
+ solidity_requirement: str
+ abicoder_v2: bool
+
+ block_doc_style: bool
+
+ indent_level: int
+ _indent_str: str
+
+ nl_str: str
+
+ items_order: ItemOrder
+
+ def __init__(
+ self,
+ buffer: str = "",
+ prelude: bool = True,
+ spdx_identifier: str = "UNLICENSED",
+ solidity_requirement: str = "",
+ abicoder_pragma: bool = False,
+ block_doc_style: bool = False,
+ indent_level: int = 0,
+ indent_with: int | str = 4,
+ nl_str: str = "\n",
+ items_order: ItemOrder = ItemOrder.default(),
+ ):
+ self.prelude = prelude
+ self.spdx_identifier = spdx_identifier
+ self.solidity_requirement = solidity_requirement
+ self.abicoder_v2 = abicoder_pragma
+ self.block_doc_style = block_doc_style
+ self.buffer = buffer
+ self.indent_level = indent_level
+ self.nl_str = nl_str
+
+ if isinstance(indent_with, int):
+ assert indent_with >= 0
+ self._indent_str = " " * indent_with
+ elif isinstance(indent_with, str):
+ self._indent_str = indent_with
+ else:
+ assert False, "indent_with must be int or str"
+
+ self.items_order = items_order
+
+ def finish(self) -> str:
+ ret = self.buffer.rstrip()
+ self.buffer = ""
+ return ret
+
+ def p_contract(self, contract: Cheatcodes, name: str, inherits: str = ""):
+ if self.prelude:
+ self.p_prelude(contract)
+
+ self._p_str("interface ")
+ name = name.strip()
+ if name != "":
+ self._p_str(name)
+ self._p_str(" ")
+ if inherits != "":
+ self._p_str("is ")
+ self._p_str(inherits)
+ self._p_str(" ")
+ self._p_str("{")
+ self._p_nl()
+ self._with_indent(lambda: self._p_items(contract))
+ self._p_str("}")
+ self._p_nl()
+
+ def _p_items(self, contract: Cheatcodes):
+ for item in self.items_order.get_list():
+ if item == Item.ERROR:
+ self.p_errors(contract.errors)
+ elif item == Item.EVENT:
+ self.p_events(contract.events)
+ elif item == Item.ENUM:
+ self.p_enums(contract.enums)
+ elif item == Item.STRUCT:
+ self.p_structs(contract.structs)
+ elif item == Item.FUNCTION:
+ self.p_functions(contract.cheatcodes)
+ else:
+ assert False, f"unknown item {item}"
+
+ def p_prelude(self, contract: Cheatcodes | None = None):
+ self._p_str(f"// SPDX-License-Identifier: {self.spdx_identifier}")
+ self._p_nl()
+
+ if self.solidity_requirement != "":
+ req = self.solidity_requirement
+ elif contract and len(contract.errors) > 0:
+ req = ">=0.8.4 <0.9.0"
+ else:
+ req = ">=0.6.0 <0.9.0"
+ self._p_str(f"pragma solidity {req};")
+ self._p_nl()
+
+ if self.abicoder_v2:
+ self._p_str("pragma experimental ABIEncoderV2;")
+ self._p_nl()
+
+ self._p_nl()
+
+ def p_errors(self, errors: list[Error]):
+ for error in errors:
+ self._p_line(lambda: self.p_error(error))
+
+ def p_error(self, error: Error):
+ self._p_comment(error.description, doc=True)
+ self._p_line(lambda: self._p_str(error.declaration))
+
+ def p_events(self, events: list[Event]):
+ for event in events:
+ self._p_line(lambda: self.p_event(event))
+
+ def p_event(self, event: Event):
+ self._p_comment(event.description, doc=True)
+ self._p_line(lambda: self._p_str(event.declaration))
+
+ def p_enums(self, enums: list[Enum]):
+ for enum in enums:
+ self._p_line(lambda: self.p_enum(enum))
+
+ def p_enum(self, enum: Enum):
+ self._p_comment(enum.description, doc=True)
+ self._p_line(lambda: self._p_str(f"enum {enum.name} {{"))
+ self._with_indent(lambda: self.p_enum_variants(enum.variants))
+ self._p_line(lambda: self._p_str("}"))
+
+ def p_enum_variants(self, variants: list[EnumVariant]):
+ for i, variant in enumerate(variants):
+ self._p_indent()
+ self._p_comment(variant.description)
+
+ self._p_indent()
+ self._p_str(variant.name)
+ if i < len(variants) - 1:
+ self._p_str(",")
+ self._p_nl()
+
+ def p_structs(self, structs: list[Struct]):
+ for struct in structs:
+ self._p_line(lambda: self.p_struct(struct))
+
+ def p_struct(self, struct: Struct):
+ self._p_comment(struct.description, doc=True)
+ self._p_line(lambda: self._p_str(f"struct {struct.name} {{"))
+ self._with_indent(lambda: self.p_struct_fields(struct.fields))
+ self._p_line(lambda: self._p_str("}"))
+
+ def p_struct_fields(self, fields: list[StructField]):
+ for field in fields:
+ self._p_line(lambda: self.p_struct_field(field))
+
+ def p_struct_field(self, field: StructField):
+ self._p_comment(field.description)
+ self._p_indented(lambda: self._p_str(f"{field.ty} {field.name};"))
+
+ def p_functions(self, cheatcodes: list[Cheatcode]):
+ for cheatcode in cheatcodes:
+ self._p_line(lambda: self.p_function(cheatcode.func))
+
+ def p_function(self, func: Function):
+ self._p_comment(func.description, doc=True)
+ self._p_line(lambda: self._p_str(func.declaration))
+
+ def _p_comment(self, s: str, doc: bool = False):
+ s = s.strip()
+ if s == "":
+ return
+
+ s = map(lambda line: line.lstrip(), s.split("\n"))
+ if self.block_doc_style:
+ self._p_str("/*")
+ if doc:
+ self._p_str("*")
+ self._p_nl()
+ for line in s:
+ self._p_indent()
+ self._p_str(" ")
+ if doc:
+ self._p_str("* ")
+ self._p_str(line)
+ self._p_nl()
+ self._p_indent()
+ self._p_str(" */")
+ self._p_nl()
+ else:
+ first_line = True
+ for line in s:
+ if not first_line:
+ self._p_indent()
+ first_line = False
+
+ if doc:
+ self._p_str("/// ")
+ else:
+ self._p_str("// ")
+ self._p_str(line)
+ self._p_nl()
+
+ def _with_indent(self, f: VoidFn):
+ self._inc_indent()
+ f()
+ self._dec_indent()
+
+ def _p_line(self, f: VoidFn):
+ self._p_indent()
+ f()
+ self._p_nl()
+
+ def _p_indented(self, f: VoidFn):
+ self._p_indent()
+ f()
+
+ def _p_indent(self):
+ for _ in range(self.indent_level):
+ self._p_str(self._indent_str)
+
+ def _p_nl(self):
+ self._p_str(self.nl_str)
+
+ def _p_str(self, txt: str):
+ self.buffer += txt
+
+ def _inc_indent(self):
+ self.indent_level += 1
+
+ def _dec_indent(self):
+ self.indent_level -= 1
+
+
+if __name__ == "__main__":
+ main()
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Base.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Base.sol
new file mode 100644
index 000000000..851ac0cd2
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Base.sol
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {StdStorage} from "./StdStorage.sol";
+import {Vm, VmSafe} from "./Vm.sol";
+
+abstract contract CommonBase {
+ // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.
+ address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code"))));
+ // console.sol and console2.sol work by executing a staticcall to this address.
+ address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;
+ // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.
+ address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+ // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38.
+ address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller"))));
+ // Address of the test contract, deployed by the DEFAULT_SENDER.
+ address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;
+ // Deterministic deployment address of the Multicall3 contract.
+ address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;
+ // The order of the secp256k1 curve.
+ uint256 internal constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+
+ uint256 internal constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ Vm internal constant vm = Vm(VM_ADDRESS);
+ StdStorage internal stdstore;
+}
+
+abstract contract TestBase is CommonBase {}
+
+abstract contract ScriptBase is CommonBase {
+ VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Script.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Script.sol
new file mode 100644
index 000000000..94e75f6cb
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Script.sol
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+// 💬 ABOUT
+// Forge Std's default Script.
+
+// 🧩 MODULES
+import {console} from "./console.sol";
+import {console2} from "./console2.sol";
+import {safeconsole} from "./safeconsole.sol";
+import {StdChains} from "./StdChains.sol";
+import {StdCheatsSafe} from "./StdCheats.sol";
+import {stdJson} from "./StdJson.sol";
+import {stdMath} from "./StdMath.sol";
+import {StdStorage, stdStorageSafe} from "./StdStorage.sol";
+import {StdStyle} from "./StdStyle.sol";
+import {StdUtils} from "./StdUtils.sol";
+import {VmSafe} from "./Vm.sol";
+
+// 📦 BOILERPLATE
+import {ScriptBase} from "./Base.sol";
+
+// ⭐️ SCRIPT
+abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils {
+ // Note: IS_SCRIPT() must return true.
+ bool public IS_SCRIPT = true;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdAssertions.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdAssertions.sol
new file mode 100644
index 000000000..857ecd570
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdAssertions.sol
@@ -0,0 +1,669 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+pragma experimental ABIEncoderV2;
+
+import {Vm} from "./Vm.sol";
+
+abstract contract StdAssertions {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ event log(string);
+ event logs(bytes);
+
+ event log_address(address);
+ event log_bytes32(bytes32);
+ event log_int(int256);
+ event log_uint(uint256);
+ event log_bytes(bytes);
+ event log_string(string);
+
+ event log_named_address(string key, address val);
+ event log_named_bytes32(string key, bytes32 val);
+ event log_named_decimal_int(string key, int256 val, uint256 decimals);
+ event log_named_decimal_uint(string key, uint256 val, uint256 decimals);
+ event log_named_int(string key, int256 val);
+ event log_named_uint(string key, uint256 val);
+ event log_named_bytes(string key, bytes val);
+ event log_named_string(string key, string val);
+
+ event log_array(uint256[] val);
+ event log_array(int256[] val);
+ event log_array(address[] val);
+ event log_named_array(string key, uint256[] val);
+ event log_named_array(string key, int256[] val);
+ event log_named_array(string key, address[] val);
+
+ bool private _failed;
+
+ function failed() public view returns (bool) {
+ if (_failed) {
+ return _failed;
+ } else {
+ return vm.load(address(vm), bytes32("failed")) != bytes32(0);
+ }
+ }
+
+ function fail() internal virtual {
+ vm.store(address(vm), bytes32("failed"), bytes32(uint256(1)));
+ _failed = true;
+ }
+
+ function assertTrue(bool data) internal pure virtual {
+ vm.assertTrue(data);
+ }
+
+ function assertTrue(bool data, string memory err) internal pure virtual {
+ vm.assertTrue(data, err);
+ }
+
+ function assertFalse(bool data) internal pure virtual {
+ vm.assertFalse(data);
+ }
+
+ function assertFalse(bool data, string memory err) internal pure virtual {
+ vm.assertFalse(data, err);
+ }
+
+ function assertEq(bool left, bool right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bool left, bool right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(uint256 left, uint256 right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals);
+ }
+
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals, err);
+ }
+
+ function assertEq(int256 left, int256 right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(int256 left, int256 right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals);
+ }
+
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertEqDecimal(left, right, decimals, err);
+ }
+
+ function assertEq(address left, address right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(address left, address right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes32 left, bytes32 right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq32(bytes32 left, bytes32 right) internal pure virtual {
+ assertEq(left, right);
+ }
+
+ function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ assertEq(left, right, err);
+ }
+
+ function assertEq(string memory left, string memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(string memory left, string memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes memory left, bytes memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bool[] memory left, bool[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(int256[] memory left, int256[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(address[] memory left, address[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(string[] memory left, string[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual {
+ vm.assertEq(left, right);
+ }
+
+ function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {
+ vm.assertEq(left, right, err);
+ }
+
+ // Legacy helper
+ function assertEqUint(uint256 left, uint256 right) internal pure virtual {
+ assertEq(left, right);
+ }
+
+ function assertNotEq(bool left, bool right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bool left, bool right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(uint256 left, uint256 right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals);
+ }
+
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err)
+ internal
+ pure
+ virtual
+ {
+ vm.assertNotEqDecimal(left, right, decimals, err);
+ }
+
+ function assertNotEq(int256 left, int256 right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals);
+ }
+
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertNotEqDecimal(left, right, decimals, err);
+ }
+
+ function assertNotEq(address left, address right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(address left, address right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes32 left, bytes32 right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual {
+ assertNotEq(left, right);
+ }
+
+ function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual {
+ assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(string memory left, string memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes memory left, bytes memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(address[] memory left, address[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(string[] memory left, string[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual {
+ vm.assertNotEq(left, right);
+ }
+
+ function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual {
+ vm.assertNotEq(left, right, err);
+ }
+
+ function assertLt(uint256 left, uint256 right) internal pure virtual {
+ vm.assertLt(left, right);
+ }
+
+ function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual {
+ vm.assertLt(left, right, err);
+ }
+
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals);
+ }
+
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals, err);
+ }
+
+ function assertLt(int256 left, int256 right) internal pure virtual {
+ vm.assertLt(left, right);
+ }
+
+ function assertLt(int256 left, int256 right, string memory err) internal pure virtual {
+ vm.assertLt(left, right, err);
+ }
+
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals);
+ }
+
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLtDecimal(left, right, decimals, err);
+ }
+
+ function assertGt(uint256 left, uint256 right) internal pure virtual {
+ vm.assertGt(left, right);
+ }
+
+ function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual {
+ vm.assertGt(left, right, err);
+ }
+
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals);
+ }
+
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals, err);
+ }
+
+ function assertGt(int256 left, int256 right) internal pure virtual {
+ vm.assertGt(left, right);
+ }
+
+ function assertGt(int256 left, int256 right, string memory err) internal pure virtual {
+ vm.assertGt(left, right, err);
+ }
+
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals);
+ }
+
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGtDecimal(left, right, decimals, err);
+ }
+
+ function assertLe(uint256 left, uint256 right) internal pure virtual {
+ vm.assertLe(left, right);
+ }
+
+ function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual {
+ vm.assertLe(left, right, err);
+ }
+
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals);
+ }
+
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals, err);
+ }
+
+ function assertLe(int256 left, int256 right) internal pure virtual {
+ vm.assertLe(left, right);
+ }
+
+ function assertLe(int256 left, int256 right, string memory err) internal pure virtual {
+ vm.assertLe(left, right, err);
+ }
+
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals);
+ }
+
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertLeDecimal(left, right, decimals, err);
+ }
+
+ function assertGe(uint256 left, uint256 right) internal pure virtual {
+ vm.assertGe(left, right);
+ }
+
+ function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual {
+ vm.assertGe(left, right, err);
+ }
+
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals);
+ }
+
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals, err);
+ }
+
+ function assertGe(int256 left, int256 right) internal pure virtual {
+ vm.assertGe(left, right);
+ }
+
+ function assertGe(int256 left, int256 right, string memory err) internal pure virtual {
+ vm.assertGe(left, right, err);
+ }
+
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals);
+ }
+
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual {
+ vm.assertGeDecimal(left, right, decimals, err);
+ }
+
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta);
+ }
+
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbs(left, right, maxDelta, err);
+ }
+
+ function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);
+ }
+
+ function assertApproxEqAbsDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);
+ }
+
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta);
+ }
+
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual {
+ vm.assertApproxEqAbs(left, right, maxDelta, err);
+ }
+
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals);
+ }
+
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err)
+ internal
+ pure
+ virtual
+ {
+ vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err);
+ }
+
+ function assertApproxEqRel(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%
+ ) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta);
+ }
+
+ function assertApproxEqRel(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta, err);
+ }
+
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);
+ }
+
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);
+ }
+
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta);
+ }
+
+ function assertApproxEqRel(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRel(left, right, maxPercentDelta, err);
+ }
+
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals);
+ }
+
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
+ uint256 decimals,
+ string memory err
+ ) internal pure virtual {
+ vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err);
+ }
+
+ // Inherited from DSTest, not used but kept for backwards-compatibility
+ function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) {
+ return keccak256(left) == keccak256(right);
+ }
+
+ function assertEq0(bytes memory left, bytes memory right) internal pure virtual {
+ assertEq(left, right);
+ }
+
+ function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ assertEq(left, right, err);
+ }
+
+ function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual {
+ assertNotEq(left, right);
+ }
+
+ function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual {
+ assertNotEq(left, right, err);
+ }
+
+ function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual {
+ assertEqCall(target, callDataA, target, callDataB, true);
+ }
+
+ function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB)
+ internal
+ virtual
+ {
+ assertEqCall(targetA, callDataA, targetB, callDataB, true);
+ }
+
+ function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData)
+ internal
+ virtual
+ {
+ assertEqCall(target, callDataA, target, callDataB, strictRevertData);
+ }
+
+ function assertEqCall(
+ address targetA,
+ bytes memory callDataA,
+ address targetB,
+ bytes memory callDataB,
+ bool strictRevertData
+ ) internal virtual {
+ (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA);
+ (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB);
+
+ if (successA && successB) {
+ assertEq(returnDataA, returnDataB, "Call return data does not match");
+ }
+
+ if (!successA && !successB && strictRevertData) {
+ assertEq(returnDataA, returnDataB, "Call revert data does not match");
+ }
+
+ if (!successA && successB) {
+ emit log("Error: Calls were not equal");
+ emit log_named_bytes(" Left call revert data", returnDataA);
+ emit log_named_bytes(" Right call return data", returnDataB);
+ revert("assertion failed");
+ }
+
+ if (successA && !successB) {
+ emit log("Error: Calls were not equal");
+ emit log_named_bytes(" Left call return data", returnDataA);
+ emit log_named_bytes(" Right call revert data", returnDataB);
+ revert("assertion failed");
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdChains.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdChains.sol
new file mode 100644
index 000000000..9ca1b82d9
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdChains.sol
@@ -0,0 +1,263 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {VmSafe} from "./Vm.sol";
+
+/**
+ * StdChains provides information about EVM compatible chains that can be used in scripts/tests.
+ * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are
+ * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of
+ * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the
+ * alias used in this contract, which can be found as the first argument to the
+ * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.
+ *
+ * There are two main ways to use this contract:
+ * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or
+ * `setChain(string memory chainAlias, Chain memory chain)`
+ * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.
+ *
+ * The first time either of those are used, chains are initialized with the default set of RPC URLs.
+ * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in
+ * `defaultRpcUrls`.
+ *
+ * The `setChain` function is straightforward, and it simply saves off the given chain data.
+ *
+ * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say
+ * we want to retrieve the RPC URL for `mainnet`:
+ * - If you have specified data with `setChain`, it will return that.
+ * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it
+ * is valid (e.g. a URL is specified, or an environment variable is given and exists).
+ * - If neither of the above conditions is met, the default data is returned.
+ *
+ * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.
+ */
+abstract contract StdChains {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ bool private stdChainsInitialized;
+
+ struct ChainData {
+ string name;
+ uint256 chainId;
+ string rpcUrl;
+ }
+
+ struct Chain {
+ // The chain name.
+ string name;
+ // The chain's Chain ID.
+ uint256 chainId;
+ // The chain's alias. (i.e. what gets specified in `foundry.toml`).
+ string chainAlias;
+ // A default RPC endpoint for this chain.
+ // NOTE: This default RPC URL is included for convenience to facilitate quick tests and
+ // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy
+ // usage as you will be throttled and this is a disservice to others who need this endpoint.
+ string rpcUrl;
+ }
+
+ // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data.
+ mapping(string => Chain) private chains;
+ // Maps from the chain's alias to it's default RPC URL.
+ mapping(string => string) private defaultRpcUrls;
+ // Maps from a chain ID to it's alias.
+ mapping(uint256 => string) private idToAlias;
+
+ bool private fallbackToDefaultRpcUrls = true;
+
+ // The RPC URL will be fetched from config or defaultRpcUrls if possible.
+ function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) {
+ require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string.");
+
+ initializeStdChains();
+ chain = chains[chainAlias];
+ require(
+ chain.chainId != 0,
+ string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found."))
+ );
+
+ chain = getChainWithUpdatedRpcUrl(chainAlias, chain);
+ }
+
+ function getChain(uint256 chainId) internal virtual returns (Chain memory chain) {
+ require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0.");
+ initializeStdChains();
+ string memory chainAlias = idToAlias[chainId];
+
+ chain = chains[chainAlias];
+
+ require(
+ chain.chainId != 0,
+ string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found."))
+ );
+
+ chain = getChainWithUpdatedRpcUrl(chainAlias, chain);
+ }
+
+ // set chain info, with priority to argument's rpcUrl field.
+ function setChain(string memory chainAlias, ChainData memory chain) internal virtual {
+ require(
+ bytes(chainAlias).length != 0,
+ "StdChains setChain(string,ChainData): Chain alias cannot be the empty string."
+ );
+
+ require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0.");
+
+ initializeStdChains();
+ string memory foundAlias = idToAlias[chain.chainId];
+
+ require(
+ bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)),
+ string(
+ abi.encodePacked(
+ "StdChains setChain(string,ChainData): Chain ID ",
+ vm.toString(chain.chainId),
+ " already used by \"",
+ foundAlias,
+ "\"."
+ )
+ )
+ );
+
+ uint256 oldChainId = chains[chainAlias].chainId;
+ delete idToAlias[oldChainId];
+
+ chains[chainAlias] =
+ Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl});
+ idToAlias[chain.chainId] = chainAlias;
+ }
+
+ // set chain info, with priority to argument's rpcUrl field.
+ function setChain(string memory chainAlias, Chain memory chain) internal virtual {
+ setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl}));
+ }
+
+ function _toUpper(string memory str) private pure returns (string memory) {
+ bytes memory strb = bytes(str);
+ bytes memory copy = new bytes(strb.length);
+ for (uint256 i = 0; i < strb.length; i++) {
+ bytes1 b = strb[i];
+ if (b >= 0x61 && b <= 0x7A) {
+ copy[i] = bytes1(uint8(b) - 32);
+ } else {
+ copy[i] = b;
+ }
+ }
+ return string(copy);
+ }
+
+ // lookup rpcUrl, in descending order of priority:
+ // current -> config (foundry.toml) -> environment variable -> default
+ function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain)
+ private
+ view
+ returns (Chain memory)
+ {
+ if (bytes(chain.rpcUrl).length == 0) {
+ try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) {
+ chain.rpcUrl = configRpcUrl;
+ } catch (bytes memory err) {
+ string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL"));
+ if (fallbackToDefaultRpcUrls) {
+ chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]);
+ } else {
+ chain.rpcUrl = vm.envString(envName);
+ }
+ // Distinguish 'not found' from 'cannot read'
+ // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions
+ bytes memory oldNotFoundError =
+ abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias)));
+ bytes memory newNotFoundError = abi.encodeWithSignature(
+ "CheatcodeError(string)", string(abi.encodePacked("invalid rpc url: ", chainAlias))
+ );
+ bytes32 errHash = keccak256(err);
+ if (
+ (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError))
+ || bytes(chain.rpcUrl).length == 0
+ ) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ revert(add(32, err), mload(err))
+ }
+ }
+ }
+ }
+ return chain;
+ }
+
+ function setFallbackToDefaultRpcUrls(bool useDefault) internal {
+ fallbackToDefaultRpcUrls = useDefault;
+ }
+
+ function initializeStdChains() private {
+ if (stdChainsInitialized) return;
+
+ stdChainsInitialized = true;
+
+ // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`
+ setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545"));
+ setChainWithDefaultRpcUrl(
+ "mainnet", ChainData("Mainnet", 1, "https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP")
+ );
+ setChainWithDefaultRpcUrl(
+ "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001")
+ );
+ setChainWithDefaultRpcUrl("holesky", ChainData("Holesky", 17000, "https://rpc.holesky.ethpandaops.io"));
+ setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io"));
+ setChainWithDefaultRpcUrl(
+ "optimism_sepolia", ChainData("Optimism Sepolia", 11155420, "https://sepolia.optimism.io")
+ );
+ setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc"));
+ setChainWithDefaultRpcUrl(
+ "arbitrum_one_sepolia", ChainData("Arbitrum One Sepolia", 421614, "https://sepolia-rollup.arbitrum.io/rpc")
+ );
+ setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc"));
+ setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com"));
+ setChainWithDefaultRpcUrl(
+ "polygon_amoy", ChainData("Polygon Amoy", 80002, "https://rpc-amoy.polygon.technology")
+ );
+ setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc"));
+ setChainWithDefaultRpcUrl(
+ "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc")
+ );
+ setChainWithDefaultRpcUrl(
+ "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org")
+ );
+ setChainWithDefaultRpcUrl(
+ "bnb_smart_chain_testnet",
+ ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel")
+ );
+ setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com"));
+ setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network"));
+ setChainWithDefaultRpcUrl(
+ "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network")
+ );
+ setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network"));
+ setChainWithDefaultRpcUrl("base_sepolia", ChainData("Base Sepolia", 84532, "https://sepolia.base.org"));
+ setChainWithDefaultRpcUrl("base", ChainData("Base", 8453, "https://mainnet.base.org"));
+ setChainWithDefaultRpcUrl("blast_sepolia", ChainData("Blast Sepolia", 168587773, "https://sepolia.blast.io"));
+ setChainWithDefaultRpcUrl("blast", ChainData("Blast", 81457, "https://rpc.blast.io"));
+ setChainWithDefaultRpcUrl("fantom_opera", ChainData("Fantom Opera", 250, "https://rpc.ankr.com/fantom/"));
+ setChainWithDefaultRpcUrl(
+ "fantom_opera_testnet", ChainData("Fantom Opera Testnet", 4002, "https://rpc.ankr.com/fantom_testnet/")
+ );
+ setChainWithDefaultRpcUrl("fraxtal", ChainData("Fraxtal", 252, "https://rpc.frax.com"));
+ setChainWithDefaultRpcUrl("fraxtal_testnet", ChainData("Fraxtal Testnet", 2522, "https://rpc.testnet.frax.com"));
+ setChainWithDefaultRpcUrl(
+ "berachain_bartio_testnet", ChainData("Berachain bArtio Testnet", 80084, "https://bartio.rpc.berachain.com")
+ );
+ setChainWithDefaultRpcUrl("flare", ChainData("Flare", 14, "https://flare-api.flare.network/ext/C/rpc"));
+ setChainWithDefaultRpcUrl(
+ "flare_coston2", ChainData("Flare Coston2", 114, "https://coston2-api.flare.network/ext/C/rpc")
+ );
+ }
+
+ // set chain info, with priority to chainAlias' rpc url in foundry.toml
+ function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private {
+ string memory rpcUrl = chain.rpcUrl;
+ defaultRpcUrls[chainAlias] = rpcUrl;
+ chain.rpcUrl = "";
+ setChain(chainAlias, chain);
+ chain.rpcUrl = rpcUrl; // restore argument
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdCheats.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdCheats.sol
new file mode 100644
index 000000000..95850d118
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdCheats.sol
@@ -0,0 +1,817 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {StdStorage, stdStorage} from "./StdStorage.sol";
+import {console2} from "./console2.sol";
+import {Vm} from "./Vm.sol";
+
+abstract contract StdCheatsSafe {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ uint256 private constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ bool private gasMeteringOff;
+
+ // Data structures to parse Transaction objects from the broadcast artifact
+ // that conform to EIP1559. The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct RawTx1559 {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ // json value name = function
+ string functionSig;
+ bytes32 hash;
+ // json value name = tx
+ RawTx1559Detail txDetail;
+ // json value name = type
+ string opcode;
+ }
+
+ struct RawTx1559Detail {
+ AccessList[] accessList;
+ bytes data;
+ address from;
+ bytes gas;
+ bytes nonce;
+ address to;
+ bytes txType;
+ bytes value;
+ }
+
+ struct Tx1559 {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ string functionSig;
+ bytes32 hash;
+ Tx1559Detail txDetail;
+ string opcode;
+ }
+
+ struct Tx1559Detail {
+ AccessList[] accessList;
+ bytes data;
+ address from;
+ uint256 gas;
+ uint256 nonce;
+ address to;
+ uint256 txType;
+ uint256 value;
+ }
+
+ // Data structures to parse Transaction objects from the broadcast artifact
+ // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct TxLegacy {
+ string[] arguments;
+ address contractAddress;
+ string contractName;
+ string functionSig;
+ string hash;
+ string opcode;
+ TxDetailLegacy transaction;
+ }
+
+ struct TxDetailLegacy {
+ AccessList[] accessList;
+ uint256 chainId;
+ bytes data;
+ address from;
+ uint256 gas;
+ uint256 gasPrice;
+ bytes32 hash;
+ uint256 nonce;
+ bytes1 opcode;
+ bytes32 r;
+ bytes32 s;
+ uint256 txType;
+ address to;
+ uint8 v;
+ uint256 value;
+ }
+
+ struct AccessList {
+ address accessAddress;
+ bytes32[] storageKeys;
+ }
+
+ // Data structures to parse Receipt objects from the broadcast artifact.
+ // The Raw structs is what is parsed from the JSON
+ // and then converted to the one that is used by the user for better UX.
+
+ struct RawReceipt {
+ bytes32 blockHash;
+ bytes blockNumber;
+ address contractAddress;
+ bytes cumulativeGasUsed;
+ bytes effectiveGasPrice;
+ address from;
+ bytes gasUsed;
+ RawReceiptLog[] logs;
+ bytes logsBloom;
+ bytes status;
+ address to;
+ bytes32 transactionHash;
+ bytes transactionIndex;
+ }
+
+ struct Receipt {
+ bytes32 blockHash;
+ uint256 blockNumber;
+ address contractAddress;
+ uint256 cumulativeGasUsed;
+ uint256 effectiveGasPrice;
+ address from;
+ uint256 gasUsed;
+ ReceiptLog[] logs;
+ bytes logsBloom;
+ uint256 status;
+ address to;
+ bytes32 transactionHash;
+ uint256 transactionIndex;
+ }
+
+ // Data structures to parse the entire broadcast artifact, assuming the
+ // transactions conform to EIP1559.
+
+ struct EIP1559ScriptArtifact {
+ string[] libraries;
+ string path;
+ string[] pending;
+ Receipt[] receipts;
+ uint256 timestamp;
+ Tx1559[] transactions;
+ TxReturn[] txReturns;
+ }
+
+ struct RawEIP1559ScriptArtifact {
+ string[] libraries;
+ string path;
+ string[] pending;
+ RawReceipt[] receipts;
+ TxReturn[] txReturns;
+ uint256 timestamp;
+ RawTx1559[] transactions;
+ }
+
+ struct RawReceiptLog {
+ // json value = address
+ address logAddress;
+ bytes32 blockHash;
+ bytes blockNumber;
+ bytes data;
+ bytes logIndex;
+ bool removed;
+ bytes32[] topics;
+ bytes32 transactionHash;
+ bytes transactionIndex;
+ bytes transactionLogIndex;
+ }
+
+ struct ReceiptLog {
+ // json value = address
+ address logAddress;
+ bytes32 blockHash;
+ uint256 blockNumber;
+ bytes data;
+ uint256 logIndex;
+ bytes32[] topics;
+ uint256 transactionIndex;
+ uint256 transactionLogIndex;
+ bool removed;
+ }
+
+ struct TxReturn {
+ string internalType;
+ string value;
+ }
+
+ struct Account {
+ address addr;
+ uint256 key;
+ }
+
+ enum AddressType {
+ Payable,
+ NonPayable,
+ ZeroAddress,
+ Precompile,
+ ForgeAddress
+ }
+
+ // Checks that `addr` is not blacklisted by token contracts that have a blacklist.
+ function assumeNotBlacklisted(address token, address addr) internal view virtual {
+ // Nothing to check if `token` is not a contract.
+ uint256 tokenCodeSize;
+ assembly {
+ tokenCodeSize := extcodesize(token)
+ }
+ require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.");
+
+ bool success;
+ bytes memory returnData;
+
+ // 4-byte selector for `isBlacklisted(address)`, used by USDC.
+ (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr));
+ vm.assume(!success || abi.decode(returnData, (bool)) == false);
+
+ // 4-byte selector for `isBlackListed(address)`, used by USDT.
+ (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr));
+ vm.assume(!success || abi.decode(returnData, (bool)) == false);
+ }
+
+ // Checks that `addr` is not blacklisted by token contracts that have a blacklist.
+ // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for
+ // backwards compatibility, since this name was used in the original PR which already has
+ // a release. This function can be removed in a future release once we want a breaking change.
+ function assumeNoBlacklisted(address token, address addr) internal view virtual {
+ assumeNotBlacklisted(token, addr);
+ }
+
+ function assumeAddressIsNot(address addr, AddressType addressType) internal virtual {
+ if (addressType == AddressType.Payable) {
+ assumeNotPayable(addr);
+ } else if (addressType == AddressType.NonPayable) {
+ assumePayable(addr);
+ } else if (addressType == AddressType.ZeroAddress) {
+ assumeNotZeroAddress(addr);
+ } else if (addressType == AddressType.Precompile) {
+ assumeNotPrecompile(addr);
+ } else if (addressType == AddressType.ForgeAddress) {
+ assumeNotForgeAddress(addr);
+ }
+ }
+
+ function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ }
+
+ function assumeAddressIsNot(
+ address addr,
+ AddressType addressType1,
+ AddressType addressType2,
+ AddressType addressType3
+ ) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ assumeAddressIsNot(addr, addressType3);
+ }
+
+ function assumeAddressIsNot(
+ address addr,
+ AddressType addressType1,
+ AddressType addressType2,
+ AddressType addressType3,
+ AddressType addressType4
+ ) internal virtual {
+ assumeAddressIsNot(addr, addressType1);
+ assumeAddressIsNot(addr, addressType2);
+ assumeAddressIsNot(addr, addressType3);
+ assumeAddressIsNot(addr, addressType4);
+ }
+
+ // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to
+ // `addr` and checking the `success` return value.
+ // NOTE: This function may result in state changes depending on the fallback/receive logic
+ // implemented by `addr`, which should be taken into account when this function is used.
+ function _isPayable(address addr) private returns (bool) {
+ require(
+ addr.balance < UINT256_MAX,
+ "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds"
+ );
+ uint256 origBalanceTest = address(this).balance;
+ uint256 origBalanceAddr = address(addr).balance;
+
+ vm.deal(address(this), 1);
+ (bool success,) = payable(addr).call{value: 1}("");
+
+ // reset balances
+ vm.deal(address(this), origBalanceTest);
+ vm.deal(addr, origBalanceAddr);
+
+ return success;
+ }
+
+ // NOTE: This function may result in state changes depending on the fallback/receive logic
+ // implemented by `addr`, which should be taken into account when this function is used. See the
+ // `_isPayable` method for more information.
+ function assumePayable(address addr) internal virtual {
+ vm.assume(_isPayable(addr));
+ }
+
+ function assumeNotPayable(address addr) internal virtual {
+ vm.assume(!_isPayable(addr));
+ }
+
+ function assumeNotZeroAddress(address addr) internal pure virtual {
+ vm.assume(addr != address(0));
+ }
+
+ function assumeNotPrecompile(address addr) internal pure virtual {
+ assumeNotPrecompile(addr, _pureChainId());
+ }
+
+ function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual {
+ // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific
+ // address), but the same rationale for excluding them applies so we include those too.
+
+ // These are reserved by Ethereum and may be on all EVM-compatible chains.
+ vm.assume(addr < address(0x1) || addr > address(0xff));
+
+ // forgefmt: disable-start
+ if (chainId == 10 || chainId == 420) {
+ // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21
+ vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800));
+ } else if (chainId == 42161 || chainId == 421613) {
+ // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains
+ vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068));
+ } else if (chainId == 43114 || chainId == 43113) {
+ // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59
+ vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff));
+ vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF));
+ vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff));
+ }
+ // forgefmt: disable-end
+ }
+
+ function assumeNotForgeAddress(address addr) internal pure virtual {
+ // vm, console, and Create2Deployer addresses
+ vm.assume(
+ addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67
+ && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C
+ );
+ }
+
+ function readEIP1559ScriptArtifact(string memory path)
+ internal
+ view
+ virtual
+ returns (EIP1559ScriptArtifact memory)
+ {
+ string memory data = vm.readFile(path);
+ bytes memory parsedData = vm.parseJson(data);
+ RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact));
+ EIP1559ScriptArtifact memory artifact;
+ artifact.libraries = rawArtifact.libraries;
+ artifact.path = rawArtifact.path;
+ artifact.timestamp = rawArtifact.timestamp;
+ artifact.pending = rawArtifact.pending;
+ artifact.txReturns = rawArtifact.txReturns;
+ artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts);
+ artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions);
+ return artifact;
+ }
+
+ function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) {
+ Tx1559[] memory txs = new Tx1559[](rawTxs.length);
+ for (uint256 i; i < rawTxs.length; i++) {
+ txs[i] = rawToConvertedEIPTx1559(rawTxs[i]);
+ }
+ return txs;
+ }
+
+ function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) {
+ Tx1559 memory transaction;
+ transaction.arguments = rawTx.arguments;
+ transaction.contractName = rawTx.contractName;
+ transaction.functionSig = rawTx.functionSig;
+ transaction.hash = rawTx.hash;
+ transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail);
+ transaction.opcode = rawTx.opcode;
+ return transaction;
+ }
+
+ function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail)
+ internal
+ pure
+ virtual
+ returns (Tx1559Detail memory)
+ {
+ Tx1559Detail memory txDetail;
+ txDetail.data = rawDetail.data;
+ txDetail.from = rawDetail.from;
+ txDetail.to = rawDetail.to;
+ txDetail.nonce = _bytesToUint(rawDetail.nonce);
+ txDetail.txType = _bytesToUint(rawDetail.txType);
+ txDetail.value = _bytesToUint(rawDetail.value);
+ txDetail.gas = _bytesToUint(rawDetail.gas);
+ txDetail.accessList = rawDetail.accessList;
+ return txDetail;
+ }
+
+ function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) {
+ string memory deployData = vm.readFile(path);
+ bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions");
+ RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[]));
+ return rawToConvertedEIPTx1559s(rawTxs);
+ }
+
+ function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) {
+ string memory deployData = vm.readFile(path);
+ string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]"));
+ bytes memory parsedDeployData = vm.parseJson(deployData, key);
+ RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559));
+ return rawToConvertedEIPTx1559(rawTx);
+ }
+
+ // Analogous to readTransactions, but for receipts.
+ function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) {
+ string memory deployData = vm.readFile(path);
+ bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts");
+ RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[]));
+ return rawToConvertedReceipts(rawReceipts);
+ }
+
+ function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) {
+ string memory deployData = vm.readFile(path);
+ string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]"));
+ bytes memory parsedDeployData = vm.parseJson(deployData, key);
+ RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt));
+ return rawToConvertedReceipt(rawReceipt);
+ }
+
+ function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) {
+ Receipt[] memory receipts = new Receipt[](rawReceipts.length);
+ for (uint256 i; i < rawReceipts.length; i++) {
+ receipts[i] = rawToConvertedReceipt(rawReceipts[i]);
+ }
+ return receipts;
+ }
+
+ function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) {
+ Receipt memory receipt;
+ receipt.blockHash = rawReceipt.blockHash;
+ receipt.to = rawReceipt.to;
+ receipt.from = rawReceipt.from;
+ receipt.contractAddress = rawReceipt.contractAddress;
+ receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice);
+ receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed);
+ receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed);
+ receipt.status = _bytesToUint(rawReceipt.status);
+ receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex);
+ receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber);
+ receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs);
+ receipt.logsBloom = rawReceipt.logsBloom;
+ receipt.transactionHash = rawReceipt.transactionHash;
+ return receipt;
+ }
+
+ function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs)
+ internal
+ pure
+ virtual
+ returns (ReceiptLog[] memory)
+ {
+ ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length);
+ for (uint256 i; i < rawLogs.length; i++) {
+ logs[i].logAddress = rawLogs[i].logAddress;
+ logs[i].blockHash = rawLogs[i].blockHash;
+ logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber);
+ logs[i].data = rawLogs[i].data;
+ logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex);
+ logs[i].topics = rawLogs[i].topics;
+ logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex);
+ logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex);
+ logs[i].removed = rawLogs[i].removed;
+ }
+ return logs;
+ }
+
+ // Deploy a contract by fetching the contract bytecode from
+ // the artifacts directory
+ // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))`
+ function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) {
+ bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed.");
+ }
+
+ function deployCode(string memory what) internal virtual returns (address addr) {
+ bytes memory bytecode = vm.getCode(what);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string): Deployment failed.");
+ }
+
+ /// @dev deploy contract with value on construction
+ function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) {
+ bytes memory bytecode = abi.encodePacked(vm.getCode(what), args);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(val, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed.");
+ }
+
+ function deployCode(string memory what, uint256 val) internal virtual returns (address addr) {
+ bytes memory bytecode = vm.getCode(what);
+ /// @solidity memory-safe-assembly
+ assembly {
+ addr := create(val, add(bytecode, 0x20), mload(bytecode))
+ }
+
+ require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed.");
+ }
+
+ // creates a labeled address and the corresponding private key
+ function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) {
+ privateKey = uint256(keccak256(abi.encodePacked(name)));
+ addr = vm.addr(privateKey);
+ vm.label(addr, name);
+ }
+
+ // creates a labeled address
+ function makeAddr(string memory name) internal virtual returns (address addr) {
+ (addr,) = makeAddrAndKey(name);
+ }
+
+ // Destroys an account immediately, sending the balance to beneficiary.
+ // Destroying means: balance will be zero, code will be empty, and nonce will be 0
+ // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce
+ // only after tx ends, this will run immediately.
+ function destroyAccount(address who, address beneficiary) internal virtual {
+ uint256 currBalance = who.balance;
+ vm.etch(who, abi.encode());
+ vm.deal(who, 0);
+ vm.resetNonce(who);
+
+ uint256 beneficiaryBalance = beneficiary.balance;
+ vm.deal(beneficiary, currBalance + beneficiaryBalance);
+ }
+
+ // creates a struct containing both a labeled address and the corresponding private key
+ function makeAccount(string memory name) internal virtual returns (Account memory account) {
+ (account.addr, account.key) = makeAddrAndKey(name);
+ }
+
+ function deriveRememberKey(string memory mnemonic, uint32 index)
+ internal
+ virtual
+ returns (address who, uint256 privateKey)
+ {
+ privateKey = vm.deriveKey(mnemonic, index);
+ who = vm.rememberKey(privateKey);
+ }
+
+ function _bytesToUint(bytes memory b) private pure returns (uint256) {
+ require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32.");
+ return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));
+ }
+
+ function isFork() internal view virtual returns (bool status) {
+ try vm.activeFork() {
+ status = true;
+ } catch (bytes memory) {}
+ }
+
+ modifier skipWhenForking() {
+ if (!isFork()) {
+ _;
+ }
+ }
+
+ modifier skipWhenNotForking() {
+ if (isFork()) {
+ _;
+ }
+ }
+
+ modifier noGasMetering() {
+ vm.pauseGasMetering();
+ // To prevent turning gas monitoring back on with nested functions that use this modifier,
+ // we check if gasMetering started in the off position. If it did, we don't want to turn
+ // it back on until we exit the top level function that used the modifier
+ //
+ // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well.
+ // funcA will have `gasStartedOff` as false, funcB will have it as true,
+ // so we only turn metering back on at the end of the funcA
+ bool gasStartedOff = gasMeteringOff;
+ gasMeteringOff = true;
+
+ _;
+
+ // if gas metering was on when this modifier was called, turn it back on at the end
+ if (!gasStartedOff) {
+ gasMeteringOff = false;
+ vm.resumeGasMetering();
+ }
+ }
+
+ // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no
+ // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We
+ // can't simply access the chain ID in a normal view or pure function because the solc View Pure
+ // Checker changed `chainid` from pure to view in 0.8.0.
+ function _viewChainId() private view returns (uint256 chainId) {
+ // Assembly required since `block.chainid` was introduced in 0.8.0.
+ assembly {
+ chainId := chainid()
+ }
+
+ address(this); // Silence warnings in older Solc versions.
+ }
+
+ function _pureChainId() private pure returns (uint256 chainId) {
+ function() internal view returns (uint256) fnIn = _viewChainId;
+ function() internal pure returns (uint256) pureChainId;
+ assembly {
+ pureChainId := fnIn
+ }
+ chainId = pureChainId();
+ }
+}
+
+// Wrappers around cheatcodes to avoid footguns
+abstract contract StdCheats is StdCheatsSafe {
+ using stdStorage for StdStorage;
+
+ StdStorage private stdstore;
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+ address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
+
+ // Skip forward or rewind time by the specified number of seconds
+ function skip(uint256 time) internal virtual {
+ vm.warp(block.timestamp + time);
+ }
+
+ function rewind(uint256 time) internal virtual {
+ vm.warp(block.timestamp - time);
+ }
+
+ // Setup a prank from an address that has some ether
+ function hoax(address msgSender) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.prank(msgSender);
+ }
+
+ function hoax(address msgSender, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.prank(msgSender);
+ }
+
+ function hoax(address msgSender, address origin) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.prank(msgSender, origin);
+ }
+
+ function hoax(address msgSender, address origin, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.prank(msgSender, origin);
+ }
+
+ // Start perpetual prank from an address that has some ether
+ function startHoax(address msgSender) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.startPrank(msgSender);
+ }
+
+ function startHoax(address msgSender, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.startPrank(msgSender);
+ }
+
+ // Start perpetual prank from an address that has some ether
+ // tx.origin is set to the origin parameter
+ function startHoax(address msgSender, address origin) internal virtual {
+ vm.deal(msgSender, 1 << 128);
+ vm.startPrank(msgSender, origin);
+ }
+
+ function startHoax(address msgSender, address origin, uint256 give) internal virtual {
+ vm.deal(msgSender, give);
+ vm.startPrank(msgSender, origin);
+ }
+
+ function changePrank(address msgSender) internal virtual {
+ console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead.");
+ vm.stopPrank();
+ vm.startPrank(msgSender);
+ }
+
+ function changePrank(address msgSender, address txOrigin) internal virtual {
+ vm.stopPrank();
+ vm.startPrank(msgSender, txOrigin);
+ }
+
+ // The same as Vm's `deal`
+ // Use the alternative signature for ERC20 tokens
+ function deal(address to, uint256 give) internal virtual {
+ vm.deal(to, give);
+ }
+
+ // Set the balance of an account for any ERC20 token
+ // Use the alternative signature to update `totalSupply`
+ function deal(address token, address to, uint256 give) internal virtual {
+ deal(token, to, give, false);
+ }
+
+ // Set the balance of an account for any ERC1155 token
+ // Use the alternative signature to update `totalSupply`
+ function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual {
+ dealERC1155(token, to, id, give, false);
+ }
+
+ function deal(address token, address to, uint256 give, bool adjust) internal virtual {
+ // get current balance
+ (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));
+ uint256 prevBal = abi.decode(balData, (uint256));
+
+ // update balance
+ stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give);
+
+ // update total supply
+ if (adjust) {
+ (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd));
+ uint256 totSup = abi.decode(totSupData, (uint256));
+ if (give < prevBal) {
+ totSup -= (prevBal - give);
+ } else {
+ totSup += (give - prevBal);
+ }
+ stdstore.target(token).sig(0x18160ddd).checked_write(totSup);
+ }
+ }
+
+ function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual {
+ // get current balance
+ (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id));
+ uint256 prevBal = abi.decode(balData, (uint256));
+
+ // update balance
+ stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give);
+
+ // update total supply
+ if (adjust) {
+ (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id));
+ require(
+ totSupData.length != 0,
+ "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply."
+ );
+ uint256 totSup = abi.decode(totSupData, (uint256));
+ if (give < prevBal) {
+ totSup -= (prevBal - give);
+ } else {
+ totSup += (give - prevBal);
+ }
+ stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup);
+ }
+ }
+
+ function dealERC721(address token, address to, uint256 id) internal virtual {
+ // check if token id is already minted and the actual owner.
+ (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id));
+ require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted.");
+
+ // get owner current balance
+ (, bytes memory fromBalData) =
+ token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address))));
+ uint256 fromPrevBal = abi.decode(fromBalData, (uint256));
+
+ // get new user current balance
+ (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to));
+ uint256 toPrevBal = abi.decode(toBalData, (uint256));
+
+ // update balances
+ stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal);
+ stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal);
+
+ // update owner
+ stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to);
+ }
+
+ function deployCodeTo(string memory what, address where) internal virtual {
+ deployCodeTo(what, "", 0, where);
+ }
+
+ function deployCodeTo(string memory what, bytes memory args, address where) internal virtual {
+ deployCodeTo(what, args, 0, where);
+ }
+
+ function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual {
+ bytes memory creationCode = vm.getCode(what);
+ vm.etch(where, abi.encodePacked(creationCode, args));
+ (bool success, bytes memory runtimeBytecode) = where.call{value: value}("");
+ require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.");
+ vm.etch(where, runtimeBytecode);
+ }
+
+ // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere.
+ function console2_log_StdCheats(string memory p0) private view {
+ (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0));
+ status;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdError.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdError.sol
new file mode 100644
index 000000000..a302191fa
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdError.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test
+pragma solidity >=0.6.2 <0.9.0;
+
+library stdError {
+ bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01);
+ bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11);
+ bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12);
+ bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21);
+ bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22);
+ bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31);
+ bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32);
+ bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41);
+ bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdInvariant.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdInvariant.sol
new file mode 100644
index 000000000..056db98fc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdInvariant.sol
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+abstract contract StdInvariant {
+ struct FuzzSelector {
+ address addr;
+ bytes4[] selectors;
+ }
+
+ struct FuzzArtifactSelector {
+ string artifact;
+ bytes4[] selectors;
+ }
+
+ struct FuzzInterface {
+ address addr;
+ string[] artifacts;
+ }
+
+ address[] private _excludedContracts;
+ address[] private _excludedSenders;
+ address[] private _targetedContracts;
+ address[] private _targetedSenders;
+
+ string[] private _excludedArtifacts;
+ string[] private _targetedArtifacts;
+
+ FuzzArtifactSelector[] private _targetedArtifactSelectors;
+
+ FuzzSelector[] private _excludedSelectors;
+ FuzzSelector[] private _targetedSelectors;
+
+ FuzzInterface[] private _targetedInterfaces;
+
+ // Functions for users:
+ // These are intended to be called in tests.
+
+ function excludeContract(address newExcludedContract_) internal {
+ _excludedContracts.push(newExcludedContract_);
+ }
+
+ function excludeSelector(FuzzSelector memory newExcludedSelector_) internal {
+ _excludedSelectors.push(newExcludedSelector_);
+ }
+
+ function excludeSender(address newExcludedSender_) internal {
+ _excludedSenders.push(newExcludedSender_);
+ }
+
+ function excludeArtifact(string memory newExcludedArtifact_) internal {
+ _excludedArtifacts.push(newExcludedArtifact_);
+ }
+
+ function targetArtifact(string memory newTargetedArtifact_) internal {
+ _targetedArtifacts.push(newTargetedArtifact_);
+ }
+
+ function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal {
+ _targetedArtifactSelectors.push(newTargetedArtifactSelector_);
+ }
+
+ function targetContract(address newTargetedContract_) internal {
+ _targetedContracts.push(newTargetedContract_);
+ }
+
+ function targetSelector(FuzzSelector memory newTargetedSelector_) internal {
+ _targetedSelectors.push(newTargetedSelector_);
+ }
+
+ function targetSender(address newTargetedSender_) internal {
+ _targetedSenders.push(newTargetedSender_);
+ }
+
+ function targetInterface(FuzzInterface memory newTargetedInterface_) internal {
+ _targetedInterfaces.push(newTargetedInterface_);
+ }
+
+ // Functions for forge:
+ // These are called by forge to run invariant tests and don't need to be called in tests.
+
+ function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) {
+ excludedArtifacts_ = _excludedArtifacts;
+ }
+
+ function excludeContracts() public view returns (address[] memory excludedContracts_) {
+ excludedContracts_ = _excludedContracts;
+ }
+
+ function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) {
+ excludedSelectors_ = _excludedSelectors;
+ }
+
+ function excludeSenders() public view returns (address[] memory excludedSenders_) {
+ excludedSenders_ = _excludedSenders;
+ }
+
+ function targetArtifacts() public view returns (string[] memory targetedArtifacts_) {
+ targetedArtifacts_ = _targetedArtifacts;
+ }
+
+ function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) {
+ targetedArtifactSelectors_ = _targetedArtifactSelectors;
+ }
+
+ function targetContracts() public view returns (address[] memory targetedContracts_) {
+ targetedContracts_ = _targetedContracts;
+ }
+
+ function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) {
+ targetedSelectors_ = _targetedSelectors;
+ }
+
+ function targetSenders() public view returns (address[] memory targetedSenders_) {
+ targetedSenders_ = _targetedSenders;
+ }
+
+ function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) {
+ targetedInterfaces_ = _targetedInterfaces;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdJson.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdJson.sol
new file mode 100644
index 000000000..2a033c03a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdJson.sol
@@ -0,0 +1,283 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.0 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {VmSafe} from "./Vm.sol";
+
+// Helpers for parsing and writing JSON files
+// To parse:
+// ```
+// using stdJson for string;
+// string memory json = vm.readFile("");
+// json.readUint("");
+// ```
+// To write:
+// ```
+// using stdJson for string;
+// string memory json = "json";
+// json.serialize("a", uint256(123));
+// string memory semiFinal = json.serialize("b", string("test"));
+// string memory finalJson = json.serialize("c", semiFinal);
+// finalJson.write("");
+// ```
+
+library stdJson {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function keyExists(string memory json, string memory key) internal view returns (bool) {
+ return vm.keyExistsJson(json, key);
+ }
+
+ function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) {
+ return vm.parseJson(json, key);
+ }
+
+ function readUint(string memory json, string memory key) internal pure returns (uint256) {
+ return vm.parseJsonUint(json, key);
+ }
+
+ function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) {
+ return vm.parseJsonUintArray(json, key);
+ }
+
+ function readInt(string memory json, string memory key) internal pure returns (int256) {
+ return vm.parseJsonInt(json, key);
+ }
+
+ function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) {
+ return vm.parseJsonIntArray(json, key);
+ }
+
+ function readBytes32(string memory json, string memory key) internal pure returns (bytes32) {
+ return vm.parseJsonBytes32(json, key);
+ }
+
+ function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) {
+ return vm.parseJsonBytes32Array(json, key);
+ }
+
+ function readString(string memory json, string memory key) internal pure returns (string memory) {
+ return vm.parseJsonString(json, key);
+ }
+
+ function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) {
+ return vm.parseJsonStringArray(json, key);
+ }
+
+ function readAddress(string memory json, string memory key) internal pure returns (address) {
+ return vm.parseJsonAddress(json, key);
+ }
+
+ function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) {
+ return vm.parseJsonAddressArray(json, key);
+ }
+
+ function readBool(string memory json, string memory key) internal pure returns (bool) {
+ return vm.parseJsonBool(json, key);
+ }
+
+ function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) {
+ return vm.parseJsonBoolArray(json, key);
+ }
+
+ function readBytes(string memory json, string memory key) internal pure returns (bytes memory) {
+ return vm.parseJsonBytes(json, key);
+ }
+
+ function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) {
+ return vm.parseJsonBytesArray(json, key);
+ }
+
+ function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {
+ return keyExists(json, key) ? readUint(json, key) : defaultValue;
+ }
+
+ function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue)
+ internal
+ view
+ returns (uint256[] memory)
+ {
+ return keyExists(json, key) ? readUintArray(json, key) : defaultValue;
+ }
+
+ function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) {
+ return keyExists(json, key) ? readInt(json, key) : defaultValue;
+ }
+
+ function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue)
+ internal
+ view
+ returns (int256[] memory)
+ {
+ return keyExists(json, key) ? readIntArray(json, key) : defaultValue;
+ }
+
+ function readBytes32Or(string memory json, string memory key, bytes32 defaultValue)
+ internal
+ view
+ returns (bytes32)
+ {
+ return keyExists(json, key) ? readBytes32(json, key) : defaultValue;
+ }
+
+ function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue)
+ internal
+ view
+ returns (bytes32[] memory)
+ {
+ return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue;
+ }
+
+ function readStringOr(string memory json, string memory key, string memory defaultValue)
+ internal
+ view
+ returns (string memory)
+ {
+ return keyExists(json, key) ? readString(json, key) : defaultValue;
+ }
+
+ function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue)
+ internal
+ view
+ returns (string[] memory)
+ {
+ return keyExists(json, key) ? readStringArray(json, key) : defaultValue;
+ }
+
+ function readAddressOr(string memory json, string memory key, address defaultValue)
+ internal
+ view
+ returns (address)
+ {
+ return keyExists(json, key) ? readAddress(json, key) : defaultValue;
+ }
+
+ function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue)
+ internal
+ view
+ returns (address[] memory)
+ {
+ return keyExists(json, key) ? readAddressArray(json, key) : defaultValue;
+ }
+
+ function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) {
+ return keyExists(json, key) ? readBool(json, key) : defaultValue;
+ }
+
+ function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue)
+ internal
+ view
+ returns (bool[] memory)
+ {
+ return keyExists(json, key) ? readBoolArray(json, key) : defaultValue;
+ }
+
+ function readBytesOr(string memory json, string memory key, bytes memory defaultValue)
+ internal
+ view
+ returns (bytes memory)
+ {
+ return keyExists(json, key) ? readBytes(json, key) : defaultValue;
+ }
+
+ function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue)
+ internal
+ view
+ returns (bytes[] memory)
+ {
+ return keyExists(json, key) ? readBytesArray(json, key) : defaultValue;
+ }
+
+ function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {
+ return vm.serializeJson(jsonKey, rootObject);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function write(string memory jsonKey, string memory path) internal {
+ vm.writeJson(jsonKey, path);
+ }
+
+ function write(string memory jsonKey, string memory path, string memory valueKey) internal {
+ vm.writeJson(jsonKey, path, valueKey);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdMath.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdMath.sol
new file mode 100644
index 000000000..459523bda
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdMath.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+library stdMath {
+ int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;
+
+ function abs(int256 a) internal pure returns (uint256) {
+ // Required or it will fail when `a = type(int256).min`
+ if (a == INT256_MIN) {
+ return 57896044618658097711785492504343953926634992332820282019728792003956564819968;
+ }
+
+ return uint256(a > 0 ? a : -a);
+ }
+
+ function delta(uint256 a, uint256 b) internal pure returns (uint256) {
+ return a > b ? a - b : b - a;
+ }
+
+ function delta(int256 a, int256 b) internal pure returns (uint256) {
+ // a and b are of the same sign
+ // this works thanks to two's complement, the left-most bit is the sign bit
+ if ((a ^ b) > -1) {
+ return delta(abs(a), abs(b));
+ }
+
+ // a and b are of opposite signs
+ return abs(a) + abs(b);
+ }
+
+ function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {
+ uint256 absDelta = delta(a, b);
+
+ return absDelta * 1e18 / b;
+ }
+
+ function percentDelta(int256 a, int256 b) internal pure returns (uint256) {
+ uint256 absDelta = delta(a, b);
+ uint256 absB = abs(b);
+
+ return absDelta * 1e18 / absB;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdStorage.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdStorage.sol
new file mode 100644
index 000000000..bf3223dee
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdStorage.sol
@@ -0,0 +1,473 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {Vm} from "./Vm.sol";
+
+struct FindData {
+ uint256 slot;
+ uint256 offsetLeft;
+ uint256 offsetRight;
+ bool found;
+}
+
+struct StdStorage {
+ mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds;
+ bytes32[] _keys;
+ bytes4 _sig;
+ uint256 _depth;
+ address _target;
+ bytes32 _set;
+ bool _enable_packed_slots;
+ bytes _calldata;
+}
+
+library stdStorageSafe {
+ event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);
+ event WARNING_UninitedSlot(address who, uint256 slot);
+
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+ uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ function sigs(string memory sigStr) internal pure returns (bytes4) {
+ return bytes4(keccak256(bytes(sigStr)));
+ }
+
+ function getCallParams(StdStorage storage self) internal view returns (bytes memory) {
+ if (self._calldata.length == 0) {
+ return flatten(self._keys);
+ } else {
+ return self._calldata;
+ }
+ }
+
+ // Calls target contract with configured parameters
+ function callTarget(StdStorage storage self) internal view returns (bool, bytes32) {
+ bytes memory cald = abi.encodePacked(self._sig, getCallParams(self));
+ (bool success, bytes memory rdat) = self._target.staticcall(cald);
+ bytes32 result = bytesToBytes32(rdat, 32 * self._depth);
+
+ return (success, result);
+ }
+
+ // Tries mutating slot value to determine if the targeted value is stored in it.
+ // If current value is 0, then we are setting slot value to type(uint256).max
+ // Otherwise, we set it to 0. That way, return value should always be affected.
+ function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) {
+ bytes32 prevSlotValue = vm.load(self._target, slot);
+ (bool success, bytes32 prevReturnValue) = callTarget(self);
+
+ bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0);
+ vm.store(self._target, slot, testVal);
+
+ (, bytes32 newReturnValue) = callTarget(self);
+
+ vm.store(self._target, slot, prevSlotValue);
+
+ return (success && (prevReturnValue != newReturnValue));
+ }
+
+ // Tries setting one of the bits in slot to 1 until return value changes.
+ // Index of resulted bit is an offset packed slot has from left/right side
+ function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) {
+ for (uint256 offset = 0; offset < 256; offset++) {
+ uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset);
+ vm.store(self._target, slot, bytes32(valueToPut));
+
+ (bool success, bytes32 data) = callTarget(self);
+
+ if (success && (uint256(data) > 0)) {
+ return (true, offset);
+ }
+ }
+ return (false, 0);
+ }
+
+ function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) {
+ bytes32 prevSlotValue = vm.load(self._target, slot);
+
+ (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true);
+ (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false);
+
+ // `findOffset` may mutate slot value, so we are setting it to initial value
+ vm.store(self._target, slot, prevSlotValue);
+ return (foundLeft && foundRight, offsetLeft, offsetRight);
+ }
+
+ function find(StdStorage storage self) internal returns (FindData storage) {
+ return find(self, true);
+ }
+
+ /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against
+ // slot complexity:
+ // if flat, will be bytes32(uint256(uint));
+ // if map, will be keccak256(abi.encode(key, uint(slot)));
+ // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))));
+ // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth);
+ function find(StdStorage storage self, bool _clear) internal returns (FindData storage) {
+ address who = self._target;
+ bytes4 fsig = self._sig;
+ uint256 field_depth = self._depth;
+ bytes memory params = getCallParams(self);
+
+ // calldata to test against
+ if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {
+ if (_clear) {
+ clear(self);
+ }
+ return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ }
+ vm.record();
+ (, bytes32 callResult) = callTarget(self);
+ (bytes32[] memory reads,) = vm.accesses(address(who));
+
+ if (reads.length == 0) {
+ revert("stdStorage find(StdStorage): No storage use detected for target.");
+ } else {
+ for (uint256 i = reads.length; --i >= 0;) {
+ bytes32 prev = vm.load(who, reads[i]);
+ if (prev == bytes32(0)) {
+ emit WARNING_UninitedSlot(who, uint256(reads[i]));
+ }
+
+ if (!checkSlotMutatesCall(self, reads[i])) {
+ continue;
+ }
+
+ (uint256 offsetLeft, uint256 offsetRight) = (0, 0);
+
+ if (self._enable_packed_slots) {
+ bool found;
+ (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]);
+ if (!found) {
+ continue;
+ }
+ }
+
+ // Check that value between found offsets is equal to the current call result
+ uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight;
+
+ if (uint256(callResult) != curVal) {
+ continue;
+ }
+
+ emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i]));
+ self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] =
+ FindData(uint256(reads[i]), offsetLeft, offsetRight, true);
+ break;
+ }
+ }
+
+ require(
+ self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found,
+ "stdStorage find(StdStorage): Slot(s) not found."
+ );
+
+ if (_clear) {
+ clear(self);
+ }
+ return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ }
+
+ function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {
+ self._target = _target;
+ return self;
+ }
+
+ function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {
+ self._sig = _sig;
+ return self;
+ }
+
+ function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {
+ self._sig = sigs(_sig);
+ return self;
+ }
+
+ function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {
+ self._calldata = _calldata;
+ return self;
+ }
+
+ function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {
+ self._keys.push(bytes32(uint256(uint160(who))));
+ return self;
+ }
+
+ function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {
+ self._keys.push(bytes32(amt));
+ return self;
+ }
+
+ function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {
+ self._keys.push(key);
+ return self;
+ }
+
+ function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {
+ self._enable_packed_slots = true;
+ return self;
+ }
+
+ function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {
+ self._depth = _depth;
+ return self;
+ }
+
+ function read(StdStorage storage self) private returns (bytes memory) {
+ FindData storage data = find(self, false);
+ uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight);
+ uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight;
+ clear(self);
+ return abi.encode(value);
+ }
+
+ function read_bytes32(StdStorage storage self) internal returns (bytes32) {
+ return abi.decode(read(self), (bytes32));
+ }
+
+ function read_bool(StdStorage storage self) internal returns (bool) {
+ int256 v = read_int(self);
+ if (v == 0) return false;
+ if (v == 1) return true;
+ revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.");
+ }
+
+ function read_address(StdStorage storage self) internal returns (address) {
+ return abi.decode(read(self), (address));
+ }
+
+ function read_uint(StdStorage storage self) internal returns (uint256) {
+ return abi.decode(read(self), (uint256));
+ }
+
+ function read_int(StdStorage storage self) internal returns (int256) {
+ return abi.decode(read(self), (int256));
+ }
+
+ function parent(StdStorage storage self) internal returns (uint256, bytes32) {
+ address who = self._target;
+ uint256 field_depth = self._depth;
+ vm.startMappingRecording();
+ uint256 child = find(self, true).slot - field_depth;
+ (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));
+ if (!found) {
+ revert(
+ "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called."
+ );
+ }
+ return (uint256(parent_slot), key);
+ }
+
+ function root(StdStorage storage self) internal returns (uint256) {
+ address who = self._target;
+ uint256 field_depth = self._depth;
+ vm.startMappingRecording();
+ uint256 child = find(self, true).slot - field_depth;
+ bool found;
+ bytes32 root_slot;
+ bytes32 parent_slot;
+ (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child));
+ if (!found) {
+ revert(
+ "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called."
+ );
+ }
+ while (found) {
+ root_slot = parent_slot;
+ (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot));
+ }
+ return uint256(root_slot);
+ }
+
+ function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) {
+ bytes32 out;
+
+ uint256 max = b.length > 32 ? 32 : b.length;
+ for (uint256 i = 0; i < max; i++) {
+ out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);
+ }
+ return out;
+ }
+
+ function flatten(bytes32[] memory b) private pure returns (bytes memory) {
+ bytes memory result = new bytes(b.length * 32);
+ for (uint256 i = 0; i < b.length; i++) {
+ bytes32 k = b[i];
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(add(result, add(32, mul(32, i))), k)
+ }
+ }
+
+ return result;
+ }
+
+ function clear(StdStorage storage self) internal {
+ delete self._target;
+ delete self._sig;
+ delete self._keys;
+ delete self._depth;
+ delete self._enable_packed_slots;
+ delete self._calldata;
+ }
+
+ // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight`
+ // (slotValue & mask) >> offsetRight will be the value of the given packed variable
+ function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) {
+ // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight;
+ // using assembly because (1 << 256) causes overflow
+ assembly {
+ mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1))
+ }
+ }
+
+ // Returns slot value with updated packed variable.
+ function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight)
+ internal
+ pure
+ returns (bytes32 newValue)
+ {
+ return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight));
+ }
+}
+
+library stdStorage {
+ Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function sigs(string memory sigStr) internal pure returns (bytes4) {
+ return stdStorageSafe.sigs(sigStr);
+ }
+
+ function find(StdStorage storage self) internal returns (uint256) {
+ return find(self, true);
+ }
+
+ function find(StdStorage storage self, bool _clear) internal returns (uint256) {
+ return stdStorageSafe.find(self, _clear).slot;
+ }
+
+ function target(StdStorage storage self, address _target) internal returns (StdStorage storage) {
+ return stdStorageSafe.target(self, _target);
+ }
+
+ function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) {
+ return stdStorageSafe.sig(self, _sig);
+ }
+
+ function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) {
+ return stdStorageSafe.sig(self, _sig);
+ }
+
+ function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, who);
+ }
+
+ function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, amt);
+ }
+
+ function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_key(self, key);
+ }
+
+ function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) {
+ return stdStorageSafe.with_calldata(self, _calldata);
+ }
+
+ function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) {
+ return stdStorageSafe.enable_packed_slots(self);
+ }
+
+ function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) {
+ return stdStorageSafe.depth(self, _depth);
+ }
+
+ function clear(StdStorage storage self) internal {
+ stdStorageSafe.clear(self);
+ }
+
+ function checked_write(StdStorage storage self, address who) internal {
+ checked_write(self, bytes32(uint256(uint160(who))));
+ }
+
+ function checked_write(StdStorage storage self, uint256 amt) internal {
+ checked_write(self, bytes32(amt));
+ }
+
+ function checked_write_int(StdStorage storage self, int256 val) internal {
+ checked_write(self, bytes32(uint256(val)));
+ }
+
+ function checked_write(StdStorage storage self, bool write) internal {
+ bytes32 t;
+ /// @solidity memory-safe-assembly
+ assembly {
+ t := write
+ }
+ checked_write(self, t);
+ }
+
+ function checked_write(StdStorage storage self, bytes32 set) internal {
+ address who = self._target;
+ bytes4 fsig = self._sig;
+ uint256 field_depth = self._depth;
+ bytes memory params = stdStorageSafe.getCallParams(self);
+
+ if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) {
+ find(self, false);
+ }
+ FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))];
+ if ((data.offsetLeft + data.offsetRight) > 0) {
+ uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight));
+ require(
+ uint256(set) < maxVal,
+ string(
+ abi.encodePacked(
+ "stdStorage find(StdStorage): Packed slot. We can't fit value greater than ",
+ vm.toString(maxVal)
+ )
+ )
+ );
+ }
+ bytes32 curVal = vm.load(who, bytes32(data.slot));
+ bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight);
+
+ vm.store(who, bytes32(data.slot), valToSet);
+
+ (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self);
+
+ if (!success || callResult != set) {
+ vm.store(who, bytes32(data.slot), curVal);
+ revert("stdStorage find(StdStorage): Failed to write value.");
+ }
+ clear(self);
+ }
+
+ function read_bytes32(StdStorage storage self) internal returns (bytes32) {
+ return stdStorageSafe.read_bytes32(self);
+ }
+
+ function read_bool(StdStorage storage self) internal returns (bool) {
+ return stdStorageSafe.read_bool(self);
+ }
+
+ function read_address(StdStorage storage self) internal returns (address) {
+ return stdStorageSafe.read_address(self);
+ }
+
+ function read_uint(StdStorage storage self) internal returns (uint256) {
+ return stdStorageSafe.read_uint(self);
+ }
+
+ function read_int(StdStorage storage self) internal returns (int256) {
+ return stdStorageSafe.read_int(self);
+ }
+
+ function parent(StdStorage storage self) internal returns (uint256, bytes32) {
+ return stdStorageSafe.parent(self);
+ }
+
+ function root(StdStorage storage self) internal returns (uint256) {
+ return stdStorageSafe.root(self);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdStyle.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdStyle.sol
new file mode 100644
index 000000000..d371e0c60
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdStyle.sol
@@ -0,0 +1,333 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+import {VmSafe} from "./Vm.sol";
+
+library StdStyle {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ string constant RED = "\u001b[91m";
+ string constant GREEN = "\u001b[92m";
+ string constant YELLOW = "\u001b[93m";
+ string constant BLUE = "\u001b[94m";
+ string constant MAGENTA = "\u001b[95m";
+ string constant CYAN = "\u001b[96m";
+ string constant BOLD = "\u001b[1m";
+ string constant DIM = "\u001b[2m";
+ string constant ITALIC = "\u001b[3m";
+ string constant UNDERLINE = "\u001b[4m";
+ string constant INVERSE = "\u001b[7m";
+ string constant RESET = "\u001b[0m";
+
+ function styleConcat(string memory style, string memory self) private pure returns (string memory) {
+ return string(abi.encodePacked(style, self, RESET));
+ }
+
+ function red(string memory self) internal pure returns (string memory) {
+ return styleConcat(RED, self);
+ }
+
+ function red(uint256 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(int256 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(address self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function red(bool self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function redBytes(bytes memory self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function redBytes32(bytes32 self) internal pure returns (string memory) {
+ return red(vm.toString(self));
+ }
+
+ function green(string memory self) internal pure returns (string memory) {
+ return styleConcat(GREEN, self);
+ }
+
+ function green(uint256 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(int256 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(address self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function green(bool self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function greenBytes(bytes memory self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function greenBytes32(bytes32 self) internal pure returns (string memory) {
+ return green(vm.toString(self));
+ }
+
+ function yellow(string memory self) internal pure returns (string memory) {
+ return styleConcat(YELLOW, self);
+ }
+
+ function yellow(uint256 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(int256 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(address self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellow(bool self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellowBytes(bytes memory self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function yellowBytes32(bytes32 self) internal pure returns (string memory) {
+ return yellow(vm.toString(self));
+ }
+
+ function blue(string memory self) internal pure returns (string memory) {
+ return styleConcat(BLUE, self);
+ }
+
+ function blue(uint256 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(int256 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(address self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blue(bool self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blueBytes(bytes memory self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function blueBytes32(bytes32 self) internal pure returns (string memory) {
+ return blue(vm.toString(self));
+ }
+
+ function magenta(string memory self) internal pure returns (string memory) {
+ return styleConcat(MAGENTA, self);
+ }
+
+ function magenta(uint256 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(int256 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(address self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magenta(bool self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magentaBytes(bytes memory self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function magentaBytes32(bytes32 self) internal pure returns (string memory) {
+ return magenta(vm.toString(self));
+ }
+
+ function cyan(string memory self) internal pure returns (string memory) {
+ return styleConcat(CYAN, self);
+ }
+
+ function cyan(uint256 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(int256 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(address self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyan(bool self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyanBytes(bytes memory self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function cyanBytes32(bytes32 self) internal pure returns (string memory) {
+ return cyan(vm.toString(self));
+ }
+
+ function bold(string memory self) internal pure returns (string memory) {
+ return styleConcat(BOLD, self);
+ }
+
+ function bold(uint256 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(int256 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(address self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function bold(bool self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function boldBytes(bytes memory self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function boldBytes32(bytes32 self) internal pure returns (string memory) {
+ return bold(vm.toString(self));
+ }
+
+ function dim(string memory self) internal pure returns (string memory) {
+ return styleConcat(DIM, self);
+ }
+
+ function dim(uint256 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(int256 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(address self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dim(bool self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dimBytes(bytes memory self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function dimBytes32(bytes32 self) internal pure returns (string memory) {
+ return dim(vm.toString(self));
+ }
+
+ function italic(string memory self) internal pure returns (string memory) {
+ return styleConcat(ITALIC, self);
+ }
+
+ function italic(uint256 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(int256 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(address self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italic(bool self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italicBytes(bytes memory self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function italicBytes32(bytes32 self) internal pure returns (string memory) {
+ return italic(vm.toString(self));
+ }
+
+ function underline(string memory self) internal pure returns (string memory) {
+ return styleConcat(UNDERLINE, self);
+ }
+
+ function underline(uint256 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(int256 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(address self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underline(bool self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underlineBytes(bytes memory self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function underlineBytes32(bytes32 self) internal pure returns (string memory) {
+ return underline(vm.toString(self));
+ }
+
+ function inverse(string memory self) internal pure returns (string memory) {
+ return styleConcat(INVERSE, self);
+ }
+
+ function inverse(uint256 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(int256 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(address self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverse(bool self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverseBytes(bytes memory self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+
+ function inverseBytes32(bytes32 self) internal pure returns (string memory) {
+ return inverse(vm.toString(self));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdToml.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdToml.sol
new file mode 100644
index 000000000..7ad3be2f9
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdToml.sol
@@ -0,0 +1,283 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.0 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {VmSafe} from "./Vm.sol";
+
+// Helpers for parsing and writing TOML files
+// To parse:
+// ```
+// using stdToml for string;
+// string memory toml = vm.readFile("");
+// toml.readUint("");
+// ```
+// To write:
+// ```
+// using stdToml for string;
+// string memory json = "json";
+// json.serialize("a", uint256(123));
+// string memory semiFinal = json.serialize("b", string("test"));
+// string memory finalJson = json.serialize("c", semiFinal);
+// finalJson.write("");
+// ```
+
+library stdToml {
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function keyExists(string memory toml, string memory key) internal view returns (bool) {
+ return vm.keyExistsToml(toml, key);
+ }
+
+ function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) {
+ return vm.parseToml(toml, key);
+ }
+
+ function readUint(string memory toml, string memory key) internal pure returns (uint256) {
+ return vm.parseTomlUint(toml, key);
+ }
+
+ function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) {
+ return vm.parseTomlUintArray(toml, key);
+ }
+
+ function readInt(string memory toml, string memory key) internal pure returns (int256) {
+ return vm.parseTomlInt(toml, key);
+ }
+
+ function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) {
+ return vm.parseTomlIntArray(toml, key);
+ }
+
+ function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) {
+ return vm.parseTomlBytes32(toml, key);
+ }
+
+ function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) {
+ return vm.parseTomlBytes32Array(toml, key);
+ }
+
+ function readString(string memory toml, string memory key) internal pure returns (string memory) {
+ return vm.parseTomlString(toml, key);
+ }
+
+ function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) {
+ return vm.parseTomlStringArray(toml, key);
+ }
+
+ function readAddress(string memory toml, string memory key) internal pure returns (address) {
+ return vm.parseTomlAddress(toml, key);
+ }
+
+ function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) {
+ return vm.parseTomlAddressArray(toml, key);
+ }
+
+ function readBool(string memory toml, string memory key) internal pure returns (bool) {
+ return vm.parseTomlBool(toml, key);
+ }
+
+ function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) {
+ return vm.parseTomlBoolArray(toml, key);
+ }
+
+ function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) {
+ return vm.parseTomlBytes(toml, key);
+ }
+
+ function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) {
+ return vm.parseTomlBytesArray(toml, key);
+ }
+
+ function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) {
+ return keyExists(toml, key) ? readUint(toml, key) : defaultValue;
+ }
+
+ function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue)
+ internal
+ view
+ returns (uint256[] memory)
+ {
+ return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue;
+ }
+
+ function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) {
+ return keyExists(toml, key) ? readInt(toml, key) : defaultValue;
+ }
+
+ function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue)
+ internal
+ view
+ returns (int256[] memory)
+ {
+ return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue;
+ }
+
+ function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue)
+ internal
+ view
+ returns (bytes32)
+ {
+ return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue;
+ }
+
+ function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue)
+ internal
+ view
+ returns (bytes32[] memory)
+ {
+ return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue;
+ }
+
+ function readStringOr(string memory toml, string memory key, string memory defaultValue)
+ internal
+ view
+ returns (string memory)
+ {
+ return keyExists(toml, key) ? readString(toml, key) : defaultValue;
+ }
+
+ function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue)
+ internal
+ view
+ returns (string[] memory)
+ {
+ return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue;
+ }
+
+ function readAddressOr(string memory toml, string memory key, address defaultValue)
+ internal
+ view
+ returns (address)
+ {
+ return keyExists(toml, key) ? readAddress(toml, key) : defaultValue;
+ }
+
+ function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue)
+ internal
+ view
+ returns (address[] memory)
+ {
+ return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue;
+ }
+
+ function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) {
+ return keyExists(toml, key) ? readBool(toml, key) : defaultValue;
+ }
+
+ function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue)
+ internal
+ view
+ returns (bool[] memory)
+ {
+ return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue;
+ }
+
+ function readBytesOr(string memory toml, string memory key, bytes memory defaultValue)
+ internal
+ view
+ returns (bytes memory)
+ {
+ return keyExists(toml, key) ? readBytes(toml, key) : defaultValue;
+ }
+
+ function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue)
+ internal
+ view
+ returns (bytes[] memory)
+ {
+ return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue;
+ }
+
+ function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) {
+ return vm.serializeJson(jsonKey, rootObject);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bool[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBool(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, uint256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeUint(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, int256[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeInt(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, address[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeAddress(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes32[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes32(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, bytes[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeBytes(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function serialize(string memory jsonKey, string memory key, string[] memory value)
+ internal
+ returns (string memory)
+ {
+ return vm.serializeString(jsonKey, key, value);
+ }
+
+ function write(string memory jsonKey, string memory path) internal {
+ vm.writeToml(jsonKey, path);
+ }
+
+ function write(string memory jsonKey, string memory path, string memory valueKey) internal {
+ vm.writeToml(jsonKey, path, valueKey);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdUtils.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdUtils.sol
new file mode 100644
index 000000000..5d120439f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdUtils.sol
@@ -0,0 +1,226 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import {IMulticall3} from "./interfaces/IMulticall3.sol";
+import {MockERC20} from "./mocks/MockERC20.sol";
+import {MockERC721} from "./mocks/MockERC721.sol";
+import {VmSafe} from "./Vm.sol";
+
+abstract contract StdUtils {
+ /*//////////////////////////////////////////////////////////////////////////
+ CONSTANTS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);
+ VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
+ address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
+ uint256 private constant INT256_MIN_ABS =
+ 57896044618658097711785492504343953926634992332820282019728792003956564819968;
+ uint256 private constant SECP256K1_ORDER =
+ 115792089237316195423570985008687907852837564279074904382605163141518161494337;
+ uint256 private constant UINT256_MAX =
+ 115792089237316195423570985008687907853269984665640564039457584007913129639935;
+
+ // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.
+ address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+
+ /*//////////////////////////////////////////////////////////////////////////
+ INTERNAL FUNCTIONS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {
+ require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min.");
+ // If x is between min and max, return x directly. This is to ensure that dictionary values
+ // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188
+ if (x >= min && x <= max) return x;
+
+ uint256 size = max - min + 1;
+
+ // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side.
+ // This helps ensure coverage of the min/max values.
+ if (x <= 3 && size > x) return min + x;
+ if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x);
+
+ // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive.
+ if (x > max) {
+ uint256 diff = x - max;
+ uint256 rem = diff % size;
+ if (rem == 0) return max;
+ result = min + rem - 1;
+ } else if (x < min) {
+ uint256 diff = min - x;
+ uint256 rem = diff % size;
+ if (rem == 0) return min;
+ result = max - rem + 1;
+ }
+ }
+
+ function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) {
+ result = _bound(x, min, max);
+ console2_log_StdUtils("Bound result", result);
+ }
+
+ function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {
+ require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min.");
+
+ // Shifting all int256 values to uint256 to use _bound function. The range of two types are:
+ // int256 : -(2**255) ~ (2**255 - 1)
+ // uint256: 0 ~ (2**256 - 1)
+ // So, add 2**255, INT256_MIN_ABS to the integer values.
+ //
+ // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow.
+ // So, use `~uint256(x) + 1` instead.
+ uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS);
+ uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS);
+ uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS);
+
+ uint256 y = _bound(_x, _min, _max);
+
+ // To move it back to int256 value, subtract INT256_MIN_ABS at here.
+ result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS);
+ }
+
+ function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) {
+ result = _bound(x, min, max);
+ console2_log_StdUtils("Bound result", vm.toString(result));
+ }
+
+ function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) {
+ result = _bound(privateKey, 1, SECP256K1_ORDER - 1);
+ }
+
+ function bytesToUint(bytes memory b) internal pure virtual returns (uint256) {
+ require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32.");
+ return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256));
+ }
+
+ /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce
+ /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol)
+ function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) {
+ console2_log_StdUtils("computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead.");
+ return vm.computeCreateAddress(deployer, nonce);
+ }
+
+ function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer)
+ internal
+ pure
+ virtual
+ returns (address)
+ {
+ console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.");
+ return vm.computeCreate2Address(salt, initcodeHash, deployer);
+ }
+
+ /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) {
+ console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead.");
+ return vm.computeCreate2Address(salt, initCodeHash);
+ }
+
+ /// @dev returns an initialized mock ERC20 contract
+ function deployMockERC20(string memory name, string memory symbol, uint8 decimals)
+ internal
+ returns (MockERC20 mock)
+ {
+ mock = new MockERC20();
+ mock.initialize(name, symbol, decimals);
+ }
+
+ /// @dev returns an initialized mock ERC721 contract
+ function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) {
+ mock = new MockERC721();
+ mock.initialize(name, symbol);
+ }
+
+ /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments
+ /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode
+ function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) {
+ return hashInitCode(creationCode, "");
+ }
+
+ /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2
+ /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode
+ /// @param args the ABI-encoded arguments to the constructor of C
+ function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) {
+ return keccak256(abi.encodePacked(creationCode, args));
+ }
+
+ // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses.
+ function getTokenBalances(address token, address[] memory addresses)
+ internal
+ virtual
+ returns (uint256[] memory balances)
+ {
+ uint256 tokenCodeSize;
+ assembly {
+ tokenCodeSize := extcodesize(token)
+ }
+ require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract.");
+
+ // ABI encode the aggregate call to Multicall3.
+ uint256 length = addresses.length;
+ IMulticall3.Call[] memory calls = new IMulticall3.Call[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ // 0x70a08231 = bytes4("balanceOf(address)"))
+ calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))});
+ }
+
+ // Make the aggregate call.
+ (, bytes[] memory returnData) = multicall.aggregate(calls);
+
+ // ABI decode the return data and return the balances.
+ balances = new uint256[](length);
+ for (uint256 i = 0; i < length; ++i) {
+ balances[i] = abi.decode(returnData[i], (uint256));
+ }
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ PRIVATE FUNCTIONS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) {
+ return address(uint160(uint256(bytesValue)));
+ }
+
+ // This section is used to prevent the compilation of console, which shortens the compilation time when console is
+ // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid
+ // any breaking changes to function signatures.
+ function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn)
+ internal
+ pure
+ returns (function(bytes memory) internal pure fnOut)
+ {
+ assembly {
+ fnOut := fnIn
+ }
+ }
+
+ function _sendLogPayload(bytes memory payload) internal pure {
+ _castLogPayloadViewToPure(_sendLogPayloadView)(payload);
+ }
+
+ function _sendLogPayloadView(bytes memory payload) private view {
+ uint256 payloadLength = payload.length;
+ address consoleAddress = CONSOLE2_ADDRESS;
+ /// @solidity memory-safe-assembly
+ assembly {
+ let payloadStart := add(payload, 32)
+ let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
+ }
+ }
+
+ function console2_log_StdUtils(string memory p0) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function console2_log_StdUtils(string memory p0, uint256 p1) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
+ }
+
+ function console2_log_StdUtils(string memory p0, string memory p1) private pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Test.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Test.sol
new file mode 100644
index 000000000..5ff60ea3f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Test.sol
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+// 💬 ABOUT
+// Forge Std's default Test.
+
+// 🧩 MODULES
+import {console} from "./console.sol";
+import {console2} from "./console2.sol";
+import {safeconsole} from "./safeconsole.sol";
+import {StdAssertions} from "./StdAssertions.sol";
+import {StdChains} from "./StdChains.sol";
+import {StdCheats} from "./StdCheats.sol";
+import {stdError} from "./StdError.sol";
+import {StdInvariant} from "./StdInvariant.sol";
+import {stdJson} from "./StdJson.sol";
+import {stdMath} from "./StdMath.sol";
+import {StdStorage, stdStorage} from "./StdStorage.sol";
+import {StdStyle} from "./StdStyle.sol";
+import {stdToml} from "./StdToml.sol";
+import {StdUtils} from "./StdUtils.sol";
+import {Vm} from "./Vm.sol";
+
+// 📦 BOILERPLATE
+import {TestBase} from "./Base.sol";
+
+// ⭐️ TEST
+abstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils {
+ // Note: IS_TEST() must return true.
+ bool public IS_TEST = true;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Vm.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Vm.sol
new file mode 100644
index 000000000..591508c09
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Vm.sol
@@ -0,0 +1,1968 @@
+// Automatically @generated by scripts/vm.py. Do not modify manually.
+
+// SPDX-License-Identifier: MIT OR Apache-2.0
+pragma solidity >=0.6.2 <0.9.0;
+pragma experimental ABIEncoderV2;
+
+/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may
+/// result in Script simulations differing from on-chain execution. It is recommended to only use
+/// these cheats in scripts.
+interface VmSafe {
+ /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.
+ enum CallerMode {
+ // No caller modification is currently active.
+ None,
+ // A one time broadcast triggered by a `vm.broadcast()` call is currently active.
+ Broadcast,
+ // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.
+ RecurrentBroadcast,
+ // A one time prank triggered by a `vm.prank()` call is currently active.
+ Prank,
+ // A recurrent prank triggered by a `vm.startPrank()` call is currently active.
+ RecurrentPrank
+ }
+
+ /// The kind of account access that occurred.
+ enum AccountAccessKind {
+ // The account was called.
+ Call,
+ // The account was called via delegatecall.
+ DelegateCall,
+ // The account was called via callcode.
+ CallCode,
+ // The account was called via staticcall.
+ StaticCall,
+ // The account was created.
+ Create,
+ // The account was selfdestructed.
+ SelfDestruct,
+ // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).
+ Resume,
+ // The account's balance was read.
+ Balance,
+ // The account's codesize was read.
+ Extcodesize,
+ // The account's codehash was read.
+ Extcodehash,
+ // The account's code was copied.
+ Extcodecopy
+ }
+
+ /// Forge execution contexts.
+ enum ForgeContext {
+ // Test group execution context (test, coverage or snapshot).
+ TestGroup,
+ // `forge test` execution context.
+ Test,
+ // `forge coverage` execution context.
+ Coverage,
+ // `forge snapshot` execution context.
+ Snapshot,
+ // Script group execution context (dry run, broadcast or resume).
+ ScriptGroup,
+ // `forge script` execution context.
+ ScriptDryRun,
+ // `forge script --broadcast` execution context.
+ ScriptBroadcast,
+ // `forge script --resume` execution context.
+ ScriptResume,
+ // Unknown `forge` execution context.
+ Unknown
+ }
+
+ /// An Ethereum log. Returned by `getRecordedLogs`.
+ struct Log {
+ // The topics of the log, including the signature, if any.
+ bytes32[] topics;
+ // The raw data of the log.
+ bytes data;
+ // The address of the log's emitter.
+ address emitter;
+ }
+
+ /// An RPC URL and its alias. Returned by `rpcUrlStructs`.
+ struct Rpc {
+ // The alias of the RPC URL.
+ string key;
+ // The RPC URL.
+ string url;
+ }
+
+ /// An RPC log object. Returned by `eth_getLogs`.
+ struct EthGetLogs {
+ // The address of the log's emitter.
+ address emitter;
+ // The topics of the log, including the signature, if any.
+ bytes32[] topics;
+ // The raw data of the log.
+ bytes data;
+ // The block hash.
+ bytes32 blockHash;
+ // The block number.
+ uint64 blockNumber;
+ // The transaction hash.
+ bytes32 transactionHash;
+ // The transaction index in the block.
+ uint64 transactionIndex;
+ // The log index.
+ uint256 logIndex;
+ // Whether the log was removed.
+ bool removed;
+ }
+
+ /// A single entry in a directory listing. Returned by `readDir`.
+ struct DirEntry {
+ // The error message, if any.
+ string errorMessage;
+ // The path of the entry.
+ string path;
+ // The depth of the entry.
+ uint64 depth;
+ // Whether the entry is a directory.
+ bool isDir;
+ // Whether the entry is a symlink.
+ bool isSymlink;
+ }
+
+ /// Metadata information about a file.
+ /// This structure is returned from the `fsMetadata` function and represents known
+ /// metadata about a file such as its permissions, size, modification
+ /// times, etc.
+ struct FsMetadata {
+ // True if this metadata is for a directory.
+ bool isDir;
+ // True if this metadata is for a symlink.
+ bool isSymlink;
+ // The size of the file, in bytes, this metadata is for.
+ uint256 length;
+ // True if this metadata is for a readonly (unwritable) file.
+ bool readOnly;
+ // The last modification time listed in this metadata.
+ uint256 modified;
+ // The last access time of this metadata.
+ uint256 accessed;
+ // The creation time listed in this metadata.
+ uint256 created;
+ }
+
+ /// A wallet with a public and private key.
+ struct Wallet {
+ // The wallet's address.
+ address addr;
+ // The wallet's public key `X`.
+ uint256 publicKeyX;
+ // The wallet's public key `Y`.
+ uint256 publicKeyY;
+ // The wallet's private key.
+ uint256 privateKey;
+ }
+
+ /// The result of a `tryFfi` call.
+ struct FfiResult {
+ // The exit code of the call.
+ int32 exitCode;
+ // The optionally hex-decoded `stdout` data.
+ bytes stdout;
+ // The `stderr` data.
+ bytes stderr;
+ }
+
+ /// Information on the chain and fork.
+ struct ChainInfo {
+ // The fork identifier. Set to zero if no fork is active.
+ uint256 forkId;
+ // The chain ID of the current fork.
+ uint256 chainId;
+ }
+
+ /// The result of a `stopAndReturnStateDiff` call.
+ struct AccountAccess {
+ // The chain and fork the access occurred.
+ ChainInfo chainInfo;
+ // The kind of account access that determines what the account is.
+ // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.
+ // If kind is Create, then the account is the newly created account.
+ // If kind is SelfDestruct, then the account is the selfdestruct recipient.
+ // If kind is a Resume, then account represents a account context that has resumed.
+ AccountAccessKind kind;
+ // The account that was accessed.
+ // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.
+ address account;
+ // What accessed the account.
+ address accessor;
+ // If the account was initialized or empty prior to the access.
+ // An account is considered initialized if it has code, a
+ // non-zero nonce, or a non-zero balance.
+ bool initialized;
+ // The previous balance of the accessed account.
+ uint256 oldBalance;
+ // The potential new balance of the accessed account.
+ // That is, all balance changes are recorded here, even if reverts occurred.
+ uint256 newBalance;
+ // Code of the account deployed by CREATE.
+ bytes deployedCode;
+ // Value passed along with the account access
+ uint256 value;
+ // Input data provided to the CREATE or CALL
+ bytes data;
+ // If this access reverted in either the current or parent context.
+ bool reverted;
+ // An ordered list of storage accesses made during an account access operation.
+ StorageAccess[] storageAccesses;
+ // Call depth traversed during the recording of state differences
+ uint64 depth;
+ }
+
+ /// The storage accessed during an `AccountAccess`.
+ struct StorageAccess {
+ // The account whose storage was accessed.
+ address account;
+ // The slot that was accessed.
+ bytes32 slot;
+ // If the access was a write.
+ bool isWrite;
+ // The previous value of the slot.
+ bytes32 previousValue;
+ // The new value of the slot.
+ bytes32 newValue;
+ // If the access was reverted.
+ bool reverted;
+ }
+
+ /// Gas used. Returned by `lastCallGas`.
+ struct Gas {
+ // The gas limit of the call.
+ uint64 gasLimit;
+ // The total gas used.
+ uint64 gasTotalUsed;
+ // DEPRECATED: The amount of gas used for memory expansion. Ref:
+ uint64 gasMemoryUsed;
+ // The amount of gas refunded.
+ int64 gasRefunded;
+ // The amount of gas remaining.
+ uint64 gasRemaining;
+ }
+
+ // ======== Crypto ========
+
+ /// Derives a private key from the name, labels the account with that name, and returns the wallet.
+ function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);
+
+ /// Generates a wallet from the private key and returns the wallet.
+ function createWallet(uint256 privateKey) external returns (Wallet memory wallet);
+
+ /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.
+ function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);
+
+ /// Derive a private key from a provided mnenomic string (or mnenomic file path)
+ /// at the derivation path `m/44'/60'/0'/0/{index}`.
+ function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnenomic string (or mnenomic file path)
+ /// at `{derivationPath}{index}`.
+ function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language
+ /// at the derivation path `m/44'/60'/0'/0/{index}`.
+ function deriveKey(string calldata mnemonic, uint32 index, string calldata language)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language
+ /// at `{derivationPath}{index}`.
+ function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)
+ external
+ pure
+ returns (uint256 privateKey);
+
+ /// Derives secp256r1 public key from the provided `privateKey`.
+ function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);
+
+ /// Adds a private key to the local forge wallet and returns the address.
+ function rememberKey(uint256 privateKey) external returns (address keyAddr);
+
+ /// Signs data with a `Wallet`.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with `privateKey` using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ /// If `--sender` is provided, the signer with provided address is used, otherwise,
+ /// if exactly one signer is provided to the script, that signer is used.
+ /// Raises error if signer passed through `--sender` does not match any unlocked signers or
+ /// if `--sender` is not provided and not exactly one signer is passed to the script.
+ function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
+ /// signature's `s` value, and the recovery id `v` in a single bytes32.
+ /// This format reduces the signature size from 65 to 64 bytes.
+ /// Raises error if none of the signers passed into the script have provided address.
+ function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
+
+ /// Signs `digest` with `privateKey` using the secp256r1 curve.
+ function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);
+
+ /// Signs data with a `Wallet`.
+ function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with `privateKey` using the secp256k1 curve.
+ function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// If `--sender` is provided, the signer with provided address is used, otherwise,
+ /// if exactly one signer is provided to the script, that signer is used.
+ /// Raises error if signer passed through `--sender` does not match any unlocked signers or
+ /// if `--sender` is not provided and not exactly one signer is passed to the script.
+ function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ /// Signs `digest` with signer provided to script using the secp256k1 curve.
+ /// Raises error if none of the signers passed into the script have provided address.
+ function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
+
+ // ======== Environment ========
+
+ /// Gets the environment variable `name` and parses it as `address`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envAddress(string calldata name) external view returns (address value);
+
+ /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bool`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBool(string calldata name) external view returns (bool value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes32`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes32(string calldata name) external view returns (bytes32 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes(string calldata name) external view returns (bytes memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);
+
+ /// Gets the environment variable `name` and returns true if it exists, else returns false.
+ function envExists(string calldata name) external view returns (bool result);
+
+ /// Gets the environment variable `name` and parses it as `int256`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envInt(string calldata name) external view returns (int256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `bool`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bool defaultValue) external view returns (bool value);
+
+ /// Gets the environment variable `name` and parses it as `uint256`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)
+ external
+ view
+ returns (address[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)
+ external
+ view
+ returns (bytes32[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)
+ external
+ view
+ returns (string[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)
+ external
+ view
+ returns (bytes[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `int256`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);
+
+ /// Gets the environment variable `name` and parses it as `address`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, address defaultValue) external view returns (address value);
+
+ /// Gets the environment variable `name` and parses it as `bytes32`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);
+
+ /// Gets the environment variable `name` and parses it as `string`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);
+
+ /// Gets the environment variable `name` and parses it as `bytes`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)
+ external
+ view
+ returns (bool[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)
+ external
+ view
+ returns (uint256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.
+ /// Reverts if the variable could not be parsed.
+ /// Returns `defaultValue` if the variable was not found.
+ function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)
+ external
+ view
+ returns (int256[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `string`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envString(string calldata name) external view returns (string memory value);
+
+ /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envString(string calldata name, string calldata delim) external view returns (string[] memory value);
+
+ /// Gets the environment variable `name` and parses it as `uint256`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envUint(string calldata name) external view returns (uint256 value);
+
+ /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.
+ /// Reverts if the variable was not found or could not be parsed.
+ function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);
+
+ /// Returns true if `forge` command was executed in given context.
+ function isContext(ForgeContext context) external view returns (bool result);
+
+ /// Sets environment variables.
+ function setEnv(string calldata name, string calldata value) external;
+
+ // ======== EVM ========
+
+ /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.
+ function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);
+
+ /// Gets the address for a given private key.
+ function addr(uint256 privateKey) external pure returns (address keyAddr);
+
+ /// Gets all the logs according to specified filter.
+ function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)
+ external
+ returns (EthGetLogs[] memory logs);
+
+ /// Gets the current `block.blobbasefee`.
+ /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlobBaseFee() external view returns (uint256 blobBaseFee);
+
+ /// Gets the current `block.number`.
+ /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlockNumber() external view returns (uint256 height);
+
+ /// Gets the current `block.timestamp`.
+ /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,
+ /// and as a result will get optimized out by the compiler.
+ /// See https://github.com/foundry-rs/foundry/issues/6180
+ function getBlockTimestamp() external view returns (uint256 timestamp);
+
+ /// Gets the map key and parent of a mapping at a given slot, for a given address.
+ function getMappingKeyAndParentOf(address target, bytes32 elementSlot)
+ external
+ returns (bool found, bytes32 key, bytes32 parent);
+
+ /// Gets the number of elements in the mapping at the given slot, for a given address.
+ function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length);
+
+ /// Gets the elements at index idx of the mapping at the given slot, for a given address. The
+ /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).
+ function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value);
+
+ /// Gets the nonce of an account.
+ function getNonce(address account) external view returns (uint64 nonce);
+
+ /// Get the nonce of a `Wallet`.
+ function getNonce(Wallet calldata wallet) external returns (uint64 nonce);
+
+ /// Gets all the recorded logs.
+ function getRecordedLogs() external returns (Log[] memory logs);
+
+ /// Gets the gas used in the last call.
+ function lastCallGas() external view returns (Gas memory gas);
+
+ /// Loads a storage slot from an address.
+ function load(address target, bytes32 slot) external view returns (bytes32 data);
+
+ /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.
+ function pauseGasMetering() external;
+
+ /// Records all storage reads and writes.
+ function record() external;
+
+ /// Record all the transaction logs.
+ function recordLogs() external;
+
+ /// Reset gas metering (i.e. gas usage is set to gas limit).
+ function resetGasMetering() external;
+
+ /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.
+ function resumeGasMetering() external;
+
+ /// Performs an Ethereum JSON-RPC request to the current fork URL.
+ function rpc(string calldata method, string calldata params) external returns (bytes memory data);
+
+ /// Performs an Ethereum JSON-RPC request to the given endpoint.
+ function rpc(string calldata urlOrAlias, string calldata method, string calldata params)
+ external
+ returns (bytes memory data);
+
+ /// Starts recording all map SSTOREs for later retrieval.
+ function startMappingRecording() external;
+
+ /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,
+ /// along with the context of the calls
+ function startStateDiffRecording() external;
+
+ /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.
+ function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);
+
+ /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.
+ function stopMappingRecording() external;
+
+ // ======== Filesystem ========
+
+ /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.
+ /// `path` is relative to the project root.
+ function closeFile(string calldata path) external;
+
+ /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.
+ /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.
+ /// Both `from` and `to` are relative to the project root.
+ function copyFile(string calldata from, string calldata to) external returns (uint64 copied);
+
+ /// Creates a new, empty directory at the provided path.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - User lacks permissions to modify `path`.
+ /// - A parent of the given path doesn't exist and `recursive` is false.
+ /// - `path` already exists and `recursive` is false.
+ /// `path` is relative to the project root.
+ function createDir(string calldata path, bool recursive) external;
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function deployCode(string calldata artifactPath) external returns (address deployedAddress);
+
+ /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ /// Additionally accepts abi-encoded constructor arguments.
+ function deployCode(string calldata artifactPath, bytes calldata constructorArgs)
+ external
+ returns (address deployedAddress);
+
+ /// Returns true if the given path points to an existing entity, else returns false.
+ function exists(string calldata path) external returns (bool result);
+
+ /// Performs a foreign function call via the terminal.
+ function ffi(string[] calldata commandInput) external returns (bytes memory result);
+
+ /// Given a path, query the file system to get information about a file, directory, etc.
+ function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);
+
+ /// Gets the artifact path from code (aka. creation code).
+ function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);
+
+ /// Gets the artifact path from deployed code (aka. runtime code).
+ function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);
+
+ /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);
+
+ /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the
+ /// artifact in the form of :: where and parts are optional.
+ function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);
+
+ /// Returns true if the path exists on disk and is pointing at a directory, else returns false.
+ function isDir(string calldata path) external returns (bool result);
+
+ /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.
+ function isFile(string calldata path) external returns (bool result);
+
+ /// Get the path of the current project root.
+ function projectRoot() external view returns (string memory path);
+
+ /// Prompts the user for a string value in the terminal.
+ function prompt(string calldata promptText) external returns (string memory input);
+
+ /// Prompts the user for an address in the terminal.
+ function promptAddress(string calldata promptText) external returns (address);
+
+ /// Prompts the user for a hidden string value in the terminal.
+ function promptSecret(string calldata promptText) external returns (string memory input);
+
+ /// Prompts the user for hidden uint256 in the terminal (usually pk).
+ function promptSecretUint(string calldata promptText) external returns (uint256);
+
+ /// Prompts the user for uint256 in the terminal.
+ function promptUint(string calldata promptText) external returns (uint256);
+
+ /// Reads the directory at the given path recursively, up to `maxDepth`.
+ /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.
+ /// Follows symbolic links if `followLinks` is true.
+ function readDir(string calldata path) external view returns (DirEntry[] memory entries);
+
+ /// See `readDir(string)`.
+ function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);
+
+ /// See `readDir(string)`.
+ function readDir(string calldata path, uint64 maxDepth, bool followLinks)
+ external
+ view
+ returns (DirEntry[] memory entries);
+
+ /// Reads the entire content of file to string. `path` is relative to the project root.
+ function readFile(string calldata path) external view returns (string memory data);
+
+ /// Reads the entire content of file as binary. `path` is relative to the project root.
+ function readFileBinary(string calldata path) external view returns (bytes memory data);
+
+ /// Reads next line of file to string.
+ function readLine(string calldata path) external view returns (string memory line);
+
+ /// Reads a symbolic link, returning the path that the link points to.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` is not a symbolic link.
+ /// - `path` does not exist.
+ function readLink(string calldata linkPath) external view returns (string memory targetPath);
+
+ /// Removes a directory at the provided path.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` doesn't exist.
+ /// - `path` isn't a directory.
+ /// - User lacks permissions to modify `path`.
+ /// - The directory is not empty and `recursive` is false.
+ /// `path` is relative to the project root.
+ function removeDir(string calldata path, bool recursive) external;
+
+ /// Removes a file from the filesystem.
+ /// This cheatcode will revert in the following situations, but is not limited to just these cases:
+ /// - `path` points to a directory.
+ /// - The file doesn't exist.
+ /// - The user lacks permissions to remove the file.
+ /// `path` is relative to the project root.
+ function removeFile(string calldata path) external;
+
+ /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.
+ function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);
+
+ /// Returns the time since unix epoch in milliseconds.
+ function unixTime() external returns (uint256 milliseconds);
+
+ /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.
+ /// `path` is relative to the project root.
+ function writeFile(string calldata path, string calldata data) external;
+
+ /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.
+ /// `path` is relative to the project root.
+ function writeFileBinary(string calldata path, bytes calldata data) external;
+
+ /// Writes line to file, creating a file if it does not exist.
+ /// `path` is relative to the project root.
+ function writeLine(string calldata path, string calldata data) external;
+
+ // ======== JSON ========
+
+ /// Checks if `key` exists in a JSON object.
+ function keyExistsJson(string calldata json, string calldata key) external view returns (bool);
+
+ /// Parses a string of JSON data at `key` and coerces it to `address`.
+ function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);
+
+ /// Parses a string of JSON data at `key` and coerces it to `address[]`.
+ function parseJsonAddressArray(string calldata json, string calldata key)
+ external
+ pure
+ returns (address[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bool`.
+ function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bool[]`.
+ function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes`.
+ function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes32`.
+ function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.
+ function parseJsonBytes32Array(string calldata json, string calldata key)
+ external
+ pure
+ returns (bytes32[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.
+ function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `int256`.
+ function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);
+
+ /// Parses a string of JSON data at `key` and coerces it to `int256[]`.
+ function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);
+
+ /// Returns an array of all the keys in a JSON object.
+ function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);
+
+ /// Parses a string of JSON data at `key` and coerces it to `string`.
+ function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `string[]`.
+ function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.
+ function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.
+ function parseJsonType(string calldata json, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.
+ function parseJsonType(string calldata json, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of JSON data at `key` and coerces it to `uint256`.
+ function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);
+
+ /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.
+ function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);
+
+ /// ABI-encodes a JSON object.
+ function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);
+
+ /// ABI-encodes a JSON object at `key`.
+ function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);
+
+ /// See `serializeJson`.
+ function serializeAddress(string calldata objectKey, string calldata valueKey, address value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBool(string calldata objectKey, string calldata valueKey, bool value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)
+ external
+ returns (string memory json);
+
+ /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.
+ /// Returns the stringified version of the specific JSON file up to that moment.
+ function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeJsonType(string calldata typeDescription, bytes calldata value)
+ external
+ pure
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeJsonType(
+ string calldata objectKey,
+ string calldata valueKey,
+ string calldata typeDescription,
+ bytes calldata value
+ ) external returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)
+ external
+ returns (string memory json);
+
+ /// See `serializeJson`.
+ function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)
+ external
+ returns (string memory json);
+
+ /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.
+ function writeJson(string calldata json, string calldata path) external;
+
+ /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key =
+ /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.
+ function writeJson(string calldata json, string calldata path, string calldata valueKey) external;
+
+ /// Checks if `key` exists in a JSON object
+ /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.
+ function keyExists(string calldata json, string calldata key) external view returns (bool);
+
+ // ======== Scripting ========
+
+ /// Takes a signed transaction and broadcasts it to the network.
+ function broadcastRawTransaction(bytes calldata data) external;
+
+ /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.
+ /// Broadcasting address is determined by checking the following in order:
+ /// 1. If `--sender` argument was provided, that address is used.
+ /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.
+ /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.
+ function broadcast() external;
+
+ /// Has the next call (at this call depth only) create a transaction with the address provided
+ /// as the sender that can later be signed and sent onchain.
+ function broadcast(address signer) external;
+
+ /// Has the next call (at this call depth only) create a transaction with the private key
+ /// provided as the sender that can later be signed and sent onchain.
+ function broadcast(uint256 privateKey) external;
+
+ /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.
+ /// Broadcasting address is determined by checking the following in order:
+ /// 1. If `--sender` argument was provided, that address is used.
+ /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.
+ /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.
+ function startBroadcast() external;
+
+ /// Has all subsequent calls (at this call depth only) create transactions with the address
+ /// provided that can later be signed and sent onchain.
+ function startBroadcast(address signer) external;
+
+ /// Has all subsequent calls (at this call depth only) create transactions with the private key
+ /// provided that can later be signed and sent onchain.
+ function startBroadcast(uint256 privateKey) external;
+
+ /// Stops collecting onchain transactions.
+ function stopBroadcast() external;
+
+ // ======== String ========
+
+ /// Returns the index of the first occurrence of a `key` in an `input` string.
+ /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.
+ /// Returns 0 in case of an empty `key`.
+ function indexOf(string calldata input, string calldata key) external pure returns (uint256);
+
+ /// Parses the given `string` into an `address`.
+ function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);
+
+ /// Parses the given `string` into a `bool`.
+ function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);
+
+ /// Parses the given `string` into `bytes`.
+ function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);
+
+ /// Parses the given `string` into a `bytes32`.
+ function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);
+
+ /// Parses the given `string` into a `int256`.
+ function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);
+
+ /// Parses the given `string` into a `uint256`.
+ function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);
+
+ /// Replaces occurrences of `from` in the given `string` with `to`.
+ function replace(string calldata input, string calldata from, string calldata to)
+ external
+ pure
+ returns (string memory output);
+
+ /// Splits the given `string` into an array of strings divided by the `delimiter`.
+ function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);
+
+ /// Converts the given `string` value to Lowercase.
+ function toLowercase(string calldata input) external pure returns (string memory output);
+
+ /// Converts the given value to a `string`.
+ function toString(address value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bytes calldata value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bytes32 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(bool value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(uint256 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given value to a `string`.
+ function toString(int256 value) external pure returns (string memory stringifiedValue);
+
+ /// Converts the given `string` value to Uppercase.
+ function toUppercase(string calldata input) external pure returns (string memory output);
+
+ /// Trims leading and trailing whitespace from the given `string` value.
+ function trim(string calldata input) external pure returns (string memory output);
+
+ // ======== Testing ========
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message.
+ function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqAbsDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message.
+ function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqAbsDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;
+
+ /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Includes error message into revert string on failure.
+ function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;
+
+ /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
+ /// Includes error message into revert string on failure.
+ function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message.
+ function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals)
+ external
+ pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqRelDecimal(
+ uint256 left,
+ uint256 right,
+ uint256 maxPercentDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message.
+ function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals)
+ external
+ pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertApproxEqRelDecimal(
+ int256 left,
+ int256 right,
+ uint256 maxPercentDelta,
+ uint256 decimals,
+ string calldata error
+ ) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;
+
+ /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Includes error message into revert string on failure.
+ function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error)
+ external
+ pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;
+
+ /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
+ /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
+ /// Includes error message into revert string on failure.
+ function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error)
+ external
+ pure;
+
+ /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `bool` values are equal.
+ function assertEq(bool left, bool right) external pure;
+
+ /// Asserts that two `bool` values are equal and includes error message into revert string on failure.
+ function assertEq(bool left, bool right, string calldata error) external pure;
+
+ /// Asserts that two `string` values are equal.
+ function assertEq(string calldata left, string calldata right) external pure;
+
+ /// Asserts that two `string` values are equal and includes error message into revert string on failure.
+ function assertEq(string calldata left, string calldata right, string calldata error) external pure;
+
+ /// Asserts that two `bytes` values are equal.
+ function assertEq(bytes calldata left, bytes calldata right) external pure;
+
+ /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bool` values are equal.
+ function assertEq(bool[] calldata left, bool[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.
+ function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `uint256 values are equal.
+ function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.
+ function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `int256` values are equal.
+ function assertEq(int256[] calldata left, int256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.
+ function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are equal.
+ function assertEq(uint256 left, uint256 right) external pure;
+
+ /// Asserts that two arrays of `address` values are equal.
+ function assertEq(address[] calldata left, address[] calldata right) external pure;
+
+ /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.
+ function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are equal.
+ function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `string` values are equal.
+ function assertEq(string[] calldata left, string[] calldata right) external pure;
+
+ /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.
+ function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes` values are equal.
+ function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.
+ function assertEq(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are equal.
+ function assertEq(int256 left, int256 right) external pure;
+
+ /// Asserts that two `int256` values are equal and includes error message into revert string on failure.
+ function assertEq(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `address` values are equal.
+ function assertEq(address left, address right) external pure;
+
+ /// Asserts that two `address` values are equal and includes error message into revert string on failure.
+ function assertEq(address left, address right, string calldata error) external pure;
+
+ /// Asserts that two `bytes32` values are equal.
+ function assertEq(bytes32 left, bytes32 right) external pure;
+
+ /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.
+ function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;
+
+ /// Asserts that the given condition is false.
+ function assertFalse(bool condition) external pure;
+
+ /// Asserts that the given condition is false and includes error message into revert string on failure.
+ function assertFalse(bool condition, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ function assertGe(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertGe(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ function assertGe(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertGe(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message.
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message.
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ function assertGt(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be greater than second.
+ /// Includes error message into revert string on failure.
+ function assertGt(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ function assertGt(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be greater than second.
+ /// Includes error message into revert string on failure.
+ function assertGt(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message.
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ function assertLe(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertLe(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ function assertLe(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than or equal to second.
+ /// Includes error message into revert string on failure.
+ function assertLe(int256 left, int256 right, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message.
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message.
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Formats values with decimals in failure message. Includes error message into revert string on failure.
+ function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ function assertLt(uint256 left, uint256 right) external pure;
+
+ /// Compares two `uint256` values. Expects first value to be less than second.
+ /// Includes error message into revert string on failure.
+ function assertLt(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ function assertLt(int256 left, int256 right) external pure;
+
+ /// Compares two `int256` values. Expects first value to be less than second.
+ /// Includes error message into revert string on failure.
+ function assertLt(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;
+
+ /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.
+ /// Includes error message into revert string on failure.
+ function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
+
+ /// Asserts that two `bool` values are not equal.
+ function assertNotEq(bool left, bool right) external pure;
+
+ /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bool left, bool right, string calldata error) external pure;
+
+ /// Asserts that two `string` values are not equal.
+ function assertNotEq(string calldata left, string calldata right) external pure;
+
+ /// Asserts that two `string` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;
+
+ /// Asserts that two `bytes` values are not equal.
+ function assertNotEq(bytes calldata left, bytes calldata right) external pure;
+
+ /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bool` values are not equal.
+ function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `uint256` values are not equal.
+ function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `int256` values are not equal.
+ function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;
+
+ /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal.
+ function assertNotEq(uint256 left, uint256 right) external pure;
+
+ /// Asserts that two arrays of `address` values are not equal.
+ function assertNotEq(address[] calldata left, address[] calldata right) external pure;
+
+ /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are not equal.
+ function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `string` values are not equal.
+ function assertNotEq(string[] calldata left, string[] calldata right) external pure;
+
+ /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two arrays of `bytes` values are not equal.
+ function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;
+
+ /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;
+
+ /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;
+
+ /// Asserts that two `int256` values are not equal.
+ function assertNotEq(int256 left, int256 right) external pure;
+
+ /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(int256 left, int256 right, string calldata error) external pure;
+
+ /// Asserts that two `address` values are not equal.
+ function assertNotEq(address left, address right) external pure;
+
+ /// Asserts that two `address` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(address left, address right, string calldata error) external pure;
+
+ /// Asserts that two `bytes32` values are not equal.
+ function assertNotEq(bytes32 left, bytes32 right) external pure;
+
+ /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.
+ function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;
+
+ /// Asserts that the given condition is true.
+ function assertTrue(bool condition) external pure;
+
+ /// Asserts that the given condition is true and includes error message into revert string on failure.
+ function assertTrue(bool condition, string calldata error) external pure;
+
+ /// If the condition is false, discard this run's fuzz inputs and generate new ones.
+ function assume(bool condition) external pure;
+
+ /// Discard this run's fuzz inputs and generate new ones if next call reverted.
+ function assumeNoRevert() external pure;
+
+ /// Writes a breakpoint to jump to in the debugger.
+ function breakpoint(string calldata char) external;
+
+ /// Writes a conditional breakpoint to jump to in the debugger.
+ function breakpoint(string calldata char, bool value) external;
+
+ /// Returns the Foundry version.
+ /// Format: ++
+ /// Sample output: 0.2.0+faa94c384+202407110019
+ /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.
+ /// For reliable version comparisons, use YYYYMMDD0000 format (e.g., >= 202407110000)
+ /// to compare timestamps while ignoring minor time differences.
+ function getFoundryVersion() external view returns (string memory version);
+
+ /// Returns the RPC url for the given alias.
+ function rpcUrl(string calldata rpcAlias) external view returns (string memory json);
+
+ /// Returns all rpc urls and their aliases as structs.
+ function rpcUrlStructs() external view returns (Rpc[] memory urls);
+
+ /// Returns all rpc urls and their aliases `[alias, url][]`.
+ function rpcUrls() external view returns (string[2][] memory urls);
+
+ /// Suspends execution of the main thread for `duration` milliseconds.
+ function sleep(uint256 duration) external;
+
+ // ======== Toml ========
+
+ /// Checks if `key` exists in a TOML table.
+ function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);
+
+ /// Parses a string of TOML data at `key` and coerces it to `address`.
+ function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);
+
+ /// Parses a string of TOML data at `key` and coerces it to `address[]`.
+ function parseTomlAddressArray(string calldata toml, string calldata key)
+ external
+ pure
+ returns (address[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bool`.
+ function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bool[]`.
+ function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes`.
+ function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes32`.
+ function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.
+ function parseTomlBytes32Array(string calldata toml, string calldata key)
+ external
+ pure
+ returns (bytes32[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.
+ function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `int256`.
+ function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);
+
+ /// Parses a string of TOML data at `key` and coerces it to `int256[]`.
+ function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);
+
+ /// Returns an array of all the keys in a TOML table.
+ function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);
+
+ /// Parses a string of TOML data at `key` and coerces it to `string`.
+ function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `string[]`.
+ function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.
+ function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.
+ function parseTomlType(string calldata toml, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.
+ function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription)
+ external
+ pure
+ returns (bytes memory);
+
+ /// Parses a string of TOML data at `key` and coerces it to `uint256`.
+ function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);
+
+ /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.
+ function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);
+
+ /// ABI-encodes a TOML table.
+ function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);
+
+ /// ABI-encodes a TOML table at `key`.
+ function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);
+
+ /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.
+ function writeToml(string calldata json, string calldata path) external;
+
+ /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key =
+ /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.
+ function writeToml(string calldata json, string calldata path, string calldata valueKey) external;
+
+ // ======== Utilities ========
+
+ /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer)
+ external
+ pure
+ returns (address);
+
+ /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.
+ function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);
+
+ /// Compute the address a contract will be deployed at for a given deployer address and nonce.
+ function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);
+
+ /// Utility cheatcode to copy storage of `from` contract to another `to` contract.
+ function copyStorage(address from, address to) external;
+
+ /// Returns ENS namehash for provided string.
+ function ensNamehash(string calldata name) external pure returns (bytes32);
+
+ /// Gets the label for the specified address.
+ function getLabel(address account) external view returns (string memory currentLabel);
+
+ /// Labels an address in call traces.
+ function label(address account, string calldata newLabel) external;
+
+ /// Pauses collection of call traces. Useful in cases when you want to skip tracing of
+ /// complex calls which are not useful for debugging.
+ function pauseTracing() external view;
+
+ /// Returns a random `address`.
+ function randomAddress() external returns (address);
+
+ /// Returns an random `bool`.
+ function randomBool() external view returns (bool);
+
+ /// Returns an random byte array value of the given length.
+ function randomBytes(uint256 len) external view returns (bytes memory);
+
+ /// Returns an random `int256` value.
+ function randomInt() external view returns (int256);
+
+ /// Returns an random `int256` value of given bits.
+ function randomInt(uint256 bits) external view returns (int256);
+
+ /// Returns a random uint256 value.
+ function randomUint() external returns (uint256);
+
+ /// Returns random uint256 value between the provided range (=min..=max).
+ function randomUint(uint256 min, uint256 max) external returns (uint256);
+
+ /// Returns an random `uint256` value of given bits.
+ function randomUint(uint256 bits) external view returns (uint256);
+
+ /// Unpauses collection of call traces.
+ function resumeTracing() external view;
+
+ /// Utility cheatcode to set arbitrary storage for given target address.
+ function setArbitraryStorage(address target) external;
+
+ /// Encodes a `bytes` value to a base64url string.
+ function toBase64URL(bytes calldata data) external pure returns (string memory);
+
+ /// Encodes a `string` value to a base64url string.
+ function toBase64URL(string calldata data) external pure returns (string memory);
+
+ /// Encodes a `bytes` value to a base64 string.
+ function toBase64(bytes calldata data) external pure returns (string memory);
+
+ /// Encodes a `string` value to a base64 string.
+ function toBase64(string calldata data) external pure returns (string memory);
+}
+
+/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used
+/// in tests, but it is not recommended to use these cheats in scripts.
+interface Vm is VmSafe {
+ // ======== EVM ========
+
+ /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.
+ function activeFork() external view returns (uint256 forkId);
+
+ /// In forking mode, explicitly grant the given address cheatcode access.
+ function allowCheatcodes(address account) external;
+
+ /// Sets `block.blobbasefee`
+ function blobBaseFee(uint256 newBlobBaseFee) external;
+
+ /// Sets the blobhashes in the transaction.
+ /// Not available on EVM versions before Cancun.
+ /// If used on unsupported EVM versions it will revert.
+ function blobhashes(bytes32[] calldata hashes) external;
+
+ /// Sets `block.chainid`.
+ function chainId(uint256 newChainId) external;
+
+ /// Clears all mocked calls.
+ function clearMockedCalls() external;
+
+ /// Sets `block.coinbase`.
+ function coinbase(address newCoinbase) external;
+
+ /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias) external returns (uint256 forkId);
+
+ /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
+
+ /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,
+ /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.
+ function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
+
+ /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);
+
+ /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
+
+ /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,
+ /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.
+ function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
+
+ /// Sets an address' balance.
+ function deal(address account, uint256 newBalance) external;
+
+ /// Removes the snapshot with the given ID created by `snapshot`.
+ /// Takes the snapshot ID to delete.
+ /// Returns `true` if the snapshot was successfully deleted.
+ /// Returns `false` if the snapshot does not exist.
+ function deleteSnapshot(uint256 snapshotId) external returns (bool success);
+
+ /// Removes _all_ snapshots previously created by `snapshot`.
+ function deleteSnapshots() external;
+
+ /// Sets `block.difficulty`.
+ /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.
+ /// Reverts if used on unsupported EVM versions.
+ function difficulty(uint256 newDifficulty) external;
+
+ /// Dump a genesis JSON file's `allocs` to disk.
+ function dumpState(string calldata pathToStateJson) external;
+
+ /// Sets an address' code.
+ function etch(address target, bytes calldata newRuntimeBytecode) external;
+
+ /// Sets `block.basefee`.
+ function fee(uint256 newBasefee) external;
+
+ /// Gets the blockhashes from the current transaction.
+ /// Not available on EVM versions before Cancun.
+ /// If used on unsupported EVM versions it will revert.
+ function getBlobhashes() external view returns (bytes32[] memory hashes);
+
+ /// Returns true if the account is marked as persistent.
+ function isPersistent(address account) external view returns (bool persistent);
+
+ /// Load a genesis JSON file's `allocs` into the in-memory revm state.
+ function loadAllocs(string calldata pathToAllocsJson) external;
+
+ /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup
+ /// Meaning, changes made to the state of this account will be kept when switching forks.
+ function makePersistent(address account) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address account0, address account1) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address account0, address account1, address account2) external;
+
+ /// See `makePersistent(address)`.
+ function makePersistent(address[] calldata accounts) external;
+
+ /// Reverts a call to an address with specified revert data.
+ function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;
+
+ /// Reverts a call to an address with a specific `msg.value`, with specified revert data.
+ function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)
+ external;
+
+ /// Mocks a call to an address, returning specified data.
+ /// Calldata can either be strict or a partial match, e.g. if you only
+ /// pass a Solidity selector to the expected calldata, then the entire Solidity
+ /// function will be mocked.
+ function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;
+
+ /// Mocks a call to an address with a specific `msg.value`, returning specified data.
+ /// Calldata match takes precedence over `msg.value` in case of ambiguity.
+ function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;
+
+ /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls
+ /// `target` with the same calldata. This functionality is similar to a delegate call made to
+ /// `target` contract from `callee`.
+ /// Can be used to substitute a call to a function with another implementation that captures
+ /// the primary logic of the original function but is easier to reason about.
+ /// If calldata is not a strict match then partial match by selector is attempted.
+ function mockFunction(address callee, address target, bytes calldata data) external;
+
+ /// Sets the *next* call's `msg.sender` to be the input address.
+ function prank(address msgSender) external;
+
+ /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.
+ function prank(address msgSender, address txOrigin) external;
+
+ /// Sets `block.prevrandao`.
+ /// Not available on EVM versions before Paris. Use `difficulty` instead.
+ /// If used on unsupported EVM versions it will revert.
+ function prevrandao(bytes32 newPrevrandao) external;
+
+ /// Sets `block.prevrandao`.
+ /// Not available on EVM versions before Paris. Use `difficulty` instead.
+ /// If used on unsupported EVM versions it will revert.
+ function prevrandao(uint256 newPrevrandao) external;
+
+ /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.
+ function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin);
+
+ /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.
+ function resetNonce(address account) external;
+
+ /// Revert the state of the EVM to a previous snapshot
+ /// Takes the snapshot ID to revert to.
+ /// Returns `true` if the snapshot was successfully reverted.
+ /// Returns `false` if the snapshot does not exist.
+ /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`.
+ function revertTo(uint256 snapshotId) external returns (bool success);
+
+ /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots
+ /// Takes the snapshot ID to revert to.
+ /// Returns `true` if the snapshot was successfully reverted and deleted.
+ /// Returns `false` if the snapshot does not exist.
+ function revertToAndDelete(uint256 snapshotId) external returns (bool success);
+
+ /// Revokes persistent status from the address, previously added via `makePersistent`.
+ function revokePersistent(address account) external;
+
+ /// See `revokePersistent(address)`.
+ function revokePersistent(address[] calldata accounts) external;
+
+ /// Sets `block.height`.
+ function roll(uint256 newHeight) external;
+
+ /// Updates the currently active fork to given block number
+ /// This is similar to `roll` but for the currently active fork.
+ function rollFork(uint256 blockNumber) external;
+
+ /// Updates the currently active fork to given transaction. This will `rollFork` with the number
+ /// of the block the transaction was mined in and replays all transaction mined before it in the block.
+ function rollFork(bytes32 txHash) external;
+
+ /// Updates the given fork to given block number.
+ function rollFork(uint256 forkId, uint256 blockNumber) external;
+
+ /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.
+ function rollFork(uint256 forkId, bytes32 txHash) external;
+
+ /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.
+ function selectFork(uint256 forkId) external;
+
+ /// Set blockhash for the current block.
+ /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.
+ function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;
+
+ /// Sets the nonce of an account. Must be higher than the current nonce of the account.
+ function setNonce(address account, uint64 newNonce) external;
+
+ /// Sets the nonce of an account to an arbitrary value.
+ function setNonceUnsafe(address account, uint64 newNonce) external;
+
+ /// Snapshot the current state of the evm.
+ /// Returns the ID of the snapshot that was created.
+ /// To revert a snapshot use `revertTo`.
+ function snapshot() external returns (uint256 snapshotId);
+
+ /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.
+ function startPrank(address msgSender) external;
+
+ /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.
+ function startPrank(address msgSender, address txOrigin) external;
+
+ /// Resets subsequent calls' `msg.sender` to be `address(this)`.
+ function stopPrank() external;
+
+ /// Stores a value to an address' storage slot.
+ function store(address target, bytes32 slot, bytes32 value) external;
+
+ /// Fetches the given transaction from the active fork and executes it on the current state.
+ function transact(bytes32 txHash) external;
+
+ /// Fetches the given transaction from the given fork and executes it on the current state.
+ function transact(uint256 forkId, bytes32 txHash) external;
+
+ /// Sets `tx.gasprice`.
+ function txGasPrice(uint256 newGasPrice) external;
+
+ /// Sets `block.timestamp`.
+ function warp(uint256 newTimestamp) external;
+
+ // ======== Testing ========
+
+ /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.
+ function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;
+
+ /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.
+ function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)
+ external;
+
+ /// Expects a call to an address with the specified calldata.
+ /// Calldata can either be a strict or a partial match.
+ function expectCall(address callee, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified calldata.
+ function expectCall(address callee, bytes calldata data, uint64 count) external;
+
+ /// Expects a call to an address with the specified `msg.value` and calldata.
+ function expectCall(address callee, uint256 msgValue, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified `msg.value` and calldata.
+ function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;
+
+ /// Expect a call to an address with the specified `msg.value`, gas, and calldata.
+ function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;
+
+ /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.
+ function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;
+
+ /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).
+ /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
+ function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData)
+ external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmitAnonymous(
+ bool checkTopic0,
+ bool checkTopic1,
+ bool checkTopic2,
+ bool checkTopic3,
+ bool checkData,
+ address emitter
+ ) external;
+
+ /// Prepare an expected anonymous log with all topic and data checks enabled.
+ /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data.
+ function expectEmitAnonymous() external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmitAnonymous(address emitter) external;
+
+ /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).
+ /// Call this function, then emit an event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)
+ external;
+
+ /// Prepare an expected log with all topic and data checks enabled.
+ /// Call this function, then emit an event, then call a function. Internally after the call, we check if
+ /// logs were emitted in the expected order with the expected topics and data.
+ function expectEmit() external;
+
+ /// Same as the previous method, but also checks supplied address against emitting contract.
+ function expectEmit(address emitter) external;
+
+ /// Expects an error on next call that starts with the revert data.
+ function expectPartialRevert(bytes4 revertData) external;
+
+ /// Expects an error on next call to reverter address, that starts with the revert data.
+ function expectPartialRevert(bytes4 revertData, address reverter) external;
+
+ /// Expects an error on next call with any revert data.
+ function expectRevert() external;
+
+ /// Expects an error on next call that exactly matches the revert data.
+ function expectRevert(bytes4 revertData) external;
+
+ /// Expects an error on next call that exactly matches the revert data.
+ function expectRevert(bytes calldata revertData) external;
+
+ /// Expects an error with any revert data on next call to reverter address.
+ function expectRevert(address reverter) external;
+
+ /// Expects an error from reverter address on next call, with any revert data.
+ function expectRevert(bytes4 revertData, address reverter) external;
+
+ /// Expects an error from reverter address on next call, that exactly matches the revert data.
+ function expectRevert(bytes calldata revertData, address reverter) external;
+
+ /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other
+ /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.
+ function expectSafeMemory(uint64 min, uint64 max) external;
+
+ /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.
+ /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges
+ /// to the set.
+ function expectSafeMemoryCall(uint64 min, uint64 max) external;
+
+ /// Marks a test as skipped. Must be called at the top level of a test.
+ function skip(bool skipTest) external;
+
+ /// Marks a test as skipped with a reason. Must be called at the top level of a test.
+ function skip(bool skipTest, string calldata reason) external;
+
+ /// Stops all safe memory expectation in the current subcontext.
+ function stopExpectSafeMemory() external;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/console.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/console.sol
new file mode 100644
index 000000000..4fdb6679e
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/console.sol
@@ -0,0 +1,1560 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+library console {
+ address constant CONSOLE_ADDRESS =
+ 0x000000000000000000636F6e736F6c652e6c6f67;
+
+ function _sendLogPayloadImplementation(bytes memory payload) internal view {
+ address consoleAddress = CONSOLE_ADDRESS;
+ /// @solidity memory-safe-assembly
+ assembly {
+ pop(
+ staticcall(
+ gas(),
+ consoleAddress,
+ add(payload, 32),
+ mload(payload),
+ 0,
+ 0
+ )
+ )
+ }
+ }
+
+ function _castToPure(
+ function(bytes memory) internal view fnIn
+ ) internal pure returns (function(bytes memory) pure fnOut) {
+ assembly {
+ fnOut := fnIn
+ }
+ }
+
+ function _sendLogPayload(bytes memory payload) internal pure {
+ _castToPure(_sendLogPayloadImplementation)(payload);
+ }
+
+ function log() internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log()"));
+ }
+
+ function logInt(int256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
+ }
+
+ function logUint(uint256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
+ }
+
+ function logString(string memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function logBool(bool p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function logAddress(address p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function logBytes(bytes memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
+ }
+
+ function logBytes1(bytes1 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
+ }
+
+ function logBytes2(bytes2 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
+ }
+
+ function logBytes3(bytes3 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
+ }
+
+ function logBytes4(bytes4 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
+ }
+
+ function logBytes5(bytes5 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
+ }
+
+ function logBytes6(bytes6 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
+ }
+
+ function logBytes7(bytes7 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
+ }
+
+ function logBytes8(bytes8 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
+ }
+
+ function logBytes9(bytes9 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
+ }
+
+ function logBytes10(bytes10 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
+ }
+
+ function logBytes11(bytes11 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
+ }
+
+ function logBytes12(bytes12 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
+ }
+
+ function logBytes13(bytes13 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
+ }
+
+ function logBytes14(bytes14 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
+ }
+
+ function logBytes15(bytes15 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
+ }
+
+ function logBytes16(bytes16 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
+ }
+
+ function logBytes17(bytes17 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
+ }
+
+ function logBytes18(bytes18 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
+ }
+
+ function logBytes19(bytes19 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
+ }
+
+ function logBytes20(bytes20 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
+ }
+
+ function logBytes21(bytes21 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
+ }
+
+ function logBytes22(bytes22 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
+ }
+
+ function logBytes23(bytes23 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
+ }
+
+ function logBytes24(bytes24 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
+ }
+
+ function logBytes25(bytes25 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
+ }
+
+ function logBytes26(bytes26 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
+ }
+
+ function logBytes27(bytes27 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
+ }
+
+ function logBytes28(bytes28 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
+ }
+
+ function logBytes29(bytes29 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
+ }
+
+ function logBytes30(bytes30 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
+ }
+
+ function logBytes31(bytes31 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
+ }
+
+ function logBytes32(bytes32 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
+ }
+
+ function log(uint256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
+ }
+
+ function log(int256 p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
+ }
+
+ function log(string memory p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
+ }
+
+ function log(bool p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
+ }
+
+ function log(address p0) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
+ }
+
+ function log(uint256 p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
+ }
+
+ function log(uint256 p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
+ }
+
+ function log(uint256 p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
+ }
+
+ function log(uint256 p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
+ }
+
+ function log(string memory p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
+ }
+
+ function log(string memory p0, int256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1));
+ }
+
+ function log(string memory p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
+ }
+
+ function log(string memory p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
+ }
+
+ function log(string memory p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
+ }
+
+ function log(bool p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
+ }
+
+ function log(bool p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
+ }
+
+ function log(bool p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
+ }
+
+ function log(bool p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
+ }
+
+ function log(address p0, uint256 p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
+ }
+
+ function log(address p0, string memory p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
+ }
+
+ function log(address p0, bool p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
+ }
+
+ function log(address p0, address p1) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
+ }
+
+ function log(string memory p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
+ }
+
+ function log(bool p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, uint256 p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, string memory p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, bool p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, uint256 p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, string memory p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, bool p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
+ }
+
+ function log(address p0, address p1, address p2) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(uint256 p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(string memory p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, uint256 p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, string memory p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, uint256 p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, string memory p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, uint256 p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, string memory p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal pure {
+ _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/console2.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/console2.sol
new file mode 100644
index 000000000..03531d91d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/console2.sol
@@ -0,0 +1,4 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.4.22 <0.9.0;
+
+import {console as console2} from "./console.sol";
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC1155.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC1155.sol
new file mode 100644
index 000000000..f7dd2b410
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC1155.sol
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import "./IERC165.sol";
+
+/// @title ERC-1155 Multi Token Standard
+/// @dev See https://eips.ethereum.org/EIPS/eip-1155
+/// Note: The ERC-165 identifier for this interface is 0xd9b67a26.
+interface IERC1155 is IERC165 {
+ /// @dev
+ /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
+ /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender).
+ /// - The `_from` argument MUST be the address of the holder whose balance is decreased.
+ /// - The `_to` argument MUST be the address of the recipient whose balance is increased.
+ /// - The `_id` argument MUST be the token type being transferred.
+ /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
+ /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
+ /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
+ event TransferSingle(
+ address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value
+ );
+
+ /// @dev
+ /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
+ /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender).
+ /// - The `_from` argument MUST be the address of the holder whose balance is decreased.
+ /// - The `_to` argument MUST be the address of the recipient whose balance is increased.
+ /// - The `_ids` argument MUST be the list of tokens being transferred.
+ /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
+ /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
+ /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
+ event TransferBatch(
+ address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values
+ );
+
+ /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled).
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+
+ /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986.
+ /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
+ event URI(string _value, uint256 indexed _id);
+
+ /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
+ /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
+ /// - MUST revert if `_to` is the zero address.
+ /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
+ /// - MUST revert on any other error.
+ /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
+ /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
+ /// @param _from Source address
+ /// @param _to Target address
+ /// @param _id ID of the token type
+ /// @param _value Transfer amount
+ /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
+ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
+
+ /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
+ /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
+ /// - MUST revert if `_to` is the zero address.
+ /// - MUST revert if length of `_ids` is not the same as length of `_values`.
+ /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
+ /// - MUST revert on any other error.
+ /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
+ /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
+ /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
+ /// @param _from Source address
+ /// @param _to Target address
+ /// @param _ids IDs of each token type (order and length must match _values array)
+ /// @param _values Transfer amounts per token type (order and length must match _ids array)
+ /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
+ function safeBatchTransferFrom(
+ address _from,
+ address _to,
+ uint256[] calldata _ids,
+ uint256[] calldata _values,
+ bytes calldata _data
+ ) external;
+
+ /// @notice Get the balance of an account's tokens.
+ /// @param _owner The address of the token holder
+ /// @param _id ID of the token
+ /// @return The _owner's balance of the token type requested
+ function balanceOf(address _owner, uint256 _id) external view returns (uint256);
+
+ /// @notice Get the balance of multiple account/token pairs
+ /// @param _owners The addresses of the token holders
+ /// @param _ids ID of the tokens
+ /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair)
+ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
+ external
+ view
+ returns (uint256[] memory);
+
+ /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
+ /// @dev MUST emit the ApprovalForAll event on success.
+ /// @param _operator Address to add to the set of authorized operators
+ /// @param _approved True if the operator is approved, false to revoke approval
+ function setApprovalForAll(address _operator, bool _approved) external;
+
+ /// @notice Queries the approval status of an operator for a given owner.
+ /// @param _owner The owner of the tokens
+ /// @param _operator Address of authorized operator
+ /// @return True if the operator is approved, false if not
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC165.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC165.sol
new file mode 100644
index 000000000..9af4bf800
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC165.sol
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+interface IERC165 {
+ /// @notice Query if a contract implements an interface
+ /// @param interfaceID The interface identifier, as specified in ERC-165
+ /// @dev Interface identification is specified in ERC-165. This function
+ /// uses less than 30,000 gas.
+ /// @return `true` if the contract implements `interfaceID` and
+ /// `interfaceID` is not 0xffffffff, `false` otherwise
+ function supportsInterface(bytes4 interfaceID) external view returns (bool);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC20.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC20.sol
new file mode 100644
index 000000000..ba40806c3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC20.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+/// @dev Interface of the ERC20 standard as defined in the EIP.
+/// @dev This includes the optional name, symbol, and decimals metadata.
+interface IERC20 {
+ /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).
+ event Transfer(address indexed from, address indexed to, uint256 value);
+
+ /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`
+ /// is the new allowance.
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ /// @notice Returns the amount of tokens in existence.
+ function totalSupply() external view returns (uint256);
+
+ /// @notice Returns the amount of tokens owned by `account`.
+ function balanceOf(address account) external view returns (uint256);
+
+ /// @notice Moves `amount` tokens from the caller's account to `to`.
+ function transfer(address to, uint256 amount) external returns (bool);
+
+ /// @notice Returns the remaining number of tokens that `spender` is allowed
+ /// to spend on behalf of `owner`
+ function allowance(address owner, address spender) external view returns (uint256);
+
+ /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.
+ /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.
+ /// `amount` is then deducted from the caller's allowance.
+ function transferFrom(address from, address to, uint256 amount) external returns (bool);
+
+ /// @notice Returns the name of the token.
+ function name() external view returns (string memory);
+
+ /// @notice Returns the symbol of the token.
+ function symbol() external view returns (string memory);
+
+ /// @notice Returns the decimals places of the token.
+ function decimals() external view returns (uint8);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC4626.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC4626.sol
new file mode 100644
index 000000000..391eeb4de
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC4626.sol
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import "./IERC20.sol";
+
+/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in
+/// https://eips.ethereum.org/EIPS/eip-4626
+interface IERC4626 is IERC20 {
+ event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
+
+ event Withdraw(
+ address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
+ );
+
+ /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
+ /// @dev
+ /// - MUST be an ERC-20 token contract.
+ /// - MUST NOT revert.
+ function asset() external view returns (address assetTokenAddress);
+
+ /// @notice Returns the total amount of the underlying asset that is “managed” by Vault.
+ /// @dev
+ /// - SHOULD include any compounding that occurs from yield.
+ /// - MUST be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT revert.
+ function totalAssets() external view returns (uint256 totalManagedAssets);
+
+ /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal
+ /// scenario where all the conditions are met.
+ /// @dev
+ /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT show any variations depending on the caller.
+ /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ /// from.
+ function convertToShares(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal
+ /// scenario where all the conditions are met.
+ /// @dev
+ /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
+ /// - MUST NOT show any variations depending on the caller.
+ /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
+ /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
+ /// from.
+ function convertToAssets(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
+ /// through a deposit call.
+ /// @dev
+ /// - MUST return a limited value if receiver is subject to some deposit limit.
+ /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
+ /// - MUST NOT revert.
+ function maxDeposit(address receiver) external view returns (uint256 maxAssets);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
+ /// current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
+ /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
+ /// in the same transaction.
+ /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
+ /// deposit would be accepted, regardless if the user has enough tokens approved, etc.
+ /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ function previewDeposit(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
+ /// @dev
+ /// - MUST emit the Deposit event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// deposit execution, and are accounted for during deposit.
+ /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
+ /// approving enough underlying tokens to the Vault contract, etc).
+ ///
+ /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ function deposit(uint256 assets, address receiver) external returns (uint256 shares);
+
+ /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
+ /// @dev
+ /// - MUST return a limited value if receiver is subject to some mint limit.
+ /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
+ /// - MUST NOT revert.
+ function maxMint(address receiver) external view returns (uint256 maxShares);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
+ /// current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
+ /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
+ /// same transaction.
+ /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
+ /// would be accepted, regardless if the user has enough tokens approved, etc.
+ /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by minting.
+ function previewMint(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
+ /// @dev
+ /// - MUST emit the Deposit event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
+ /// execution, and are accounted for during mint.
+ /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
+ /// approving enough underlying tokens to the Vault contract, etc).
+ ///
+ /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
+ function mint(uint256 shares, address receiver) external returns (uint256 assets);
+
+ /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
+ /// Vault, through a withdrawal call.
+ /// @dev
+ /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ /// - MUST NOT revert.
+ function maxWithdraw(address owner) external view returns (uint256 maxAssets);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
+ /// given current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
+ /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
+ /// called
+ /// in the same transaction.
+ /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
+ /// the withdrawal would be accepted, regardless if the user has enough shares, etc.
+ /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
+ function previewWithdraw(uint256 assets) external view returns (uint256 shares);
+
+ /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver.
+ /// @dev
+ /// - MUST emit the Withdraw event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// withdraw execution, and are accounted for during withdrawal.
+ /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
+ /// not having enough shares, etc).
+ ///
+ /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ /// Those methods should be performed separately.
+ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
+
+ /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
+ /// through a redeem call.
+ /// @dev
+ /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
+ /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
+ /// - MUST NOT revert.
+ function maxRedeem(address owner) external view returns (uint256 maxShares);
+
+ /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
+ /// given current on-chain conditions.
+ /// @dev
+ /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
+ /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
+ /// same transaction.
+ /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
+ /// redemption would be accepted, regardless if the user has enough shares, etc.
+ /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
+ /// - MUST NOT revert.
+ ///
+ /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
+ /// share price or some other type of condition, meaning the depositor will lose assets by redeeming.
+ function previewRedeem(uint256 shares) external view returns (uint256 assets);
+
+ /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver.
+ /// @dev
+ /// - MUST emit the Withdraw event.
+ /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
+ /// redeem execution, and are accounted for during redeem.
+ /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
+ /// not having enough shares, etc).
+ ///
+ /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
+ /// Those methods should be performed separately.
+ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC721.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC721.sol
new file mode 100644
index 000000000..0a16f45cc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC721.sol
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2;
+
+import "./IERC165.sol";
+
+/// @title ERC-721 Non-Fungible Token Standard
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.
+interface IERC721 is IERC165 {
+ /// @dev This emits when ownership of any NFT changes by any mechanism.
+ /// This event emits when NFTs are created (`from` == 0) and destroyed
+ /// (`to` == 0). Exception: during contract creation, any number of NFTs
+ /// may be created and assigned without emitting Transfer. At the time of
+ /// any transfer, the approved address for that NFT (if any) is reset to none.
+ event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
+
+ /// @dev This emits when the approved address for an NFT is changed or
+ /// reaffirmed. The zero address indicates there is no approved address.
+ /// When a Transfer event emits, this also indicates that the approved
+ /// address for that NFT (if any) is reset to none.
+ event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
+
+ /// @dev This emits when an operator is enabled or disabled for an owner.
+ /// The operator can manage all NFTs of the owner.
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+
+ /// @notice Count all NFTs assigned to an owner
+ /// @dev NFTs assigned to the zero address are considered invalid, and this
+ /// function throws for queries about the zero address.
+ /// @param _owner An address for whom to query the balance
+ /// @return The number of NFTs owned by `_owner`, possibly zero
+ function balanceOf(address _owner) external view returns (uint256);
+
+ /// @notice Find the owner of an NFT
+ /// @dev NFTs assigned to zero address are considered invalid, and queries
+ /// about them do throw.
+ /// @param _tokenId The identifier for an NFT
+ /// @return The address of the owner of the NFT
+ function ownerOf(uint256 _tokenId) external view returns (address);
+
+ /// @notice Transfers the ownership of an NFT from one address to another address
+ /// @dev Throws unless `msg.sender` is the current owner, an authorized
+ /// operator, or the approved address for this NFT. Throws if `_from` is
+ /// not the current owner. Throws if `_to` is the zero address. Throws if
+ /// `_tokenId` is not a valid NFT. When transfer is complete, this function
+ /// checks if `_to` is a smart contract (code size > 0). If so, it calls
+ /// `onERC721Received` on `_to` and throws if the return value is not
+ /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ /// @param data Additional data with no specified format, sent in call to `_to`
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
+
+ /// @notice Transfers the ownership of an NFT from one address to another address
+ /// @dev This works identically to the other function with an extra data parameter,
+ /// except this function just sets data to "".
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
+
+ /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+ /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+ /// THEY MAY BE PERMANENTLY LOST
+ /// @dev Throws unless `msg.sender` is the current owner, an authorized
+ /// operator, or the approved address for this NFT. Throws if `_from` is
+ /// not the current owner. Throws if `_to` is the zero address. Throws if
+ /// `_tokenId` is not a valid NFT.
+ /// @param _from The current owner of the NFT
+ /// @param _to The new owner
+ /// @param _tokenId The NFT to transfer
+ function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
+
+ /// @notice Change or reaffirm the approved address for an NFT
+ /// @dev The zero address indicates there is no approved address.
+ /// Throws unless `msg.sender` is the current NFT owner, or an authorized
+ /// operator of the current owner.
+ /// @param _approved The new approved NFT controller
+ /// @param _tokenId The NFT to approve
+ function approve(address _approved, uint256 _tokenId) external payable;
+
+ /// @notice Enable or disable approval for a third party ("operator") to manage
+ /// all of `msg.sender`'s assets
+ /// @dev Emits the ApprovalForAll event. The contract MUST allow
+ /// multiple operators per owner.
+ /// @param _operator Address to add to the set of authorized operators
+ /// @param _approved True if the operator is approved, false to revoke approval
+ function setApprovalForAll(address _operator, bool _approved) external;
+
+ /// @notice Get the approved address for a single NFT
+ /// @dev Throws if `_tokenId` is not a valid NFT.
+ /// @param _tokenId The NFT to find the approved address for
+ /// @return The approved address for this NFT, or the zero address if there is none
+ function getApproved(uint256 _tokenId) external view returns (address);
+
+ /// @notice Query if an address is an authorized operator for another address
+ /// @param _owner The address that owns the NFTs
+ /// @param _operator The address that acts on behalf of the owner
+ /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+}
+
+/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
+interface IERC721TokenReceiver {
+ /// @notice Handle the receipt of an NFT
+ /// @dev The ERC721 smart contract calls this function on the recipient
+ /// after a `transfer`. This function MAY throw to revert and reject the
+ /// transfer. Return of other than the magic value MUST result in the
+ /// transaction being reverted.
+ /// Note: the contract address is always the message sender.
+ /// @param _operator The address which called `safeTransferFrom` function
+ /// @param _from The address which previously owned the token
+ /// @param _tokenId The NFT identifier which is being transferred
+ /// @param _data Additional data with no specified format
+ /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
+ /// unless throwing
+ function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data)
+ external
+ returns (bytes4);
+}
+
+/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.
+interface IERC721Metadata is IERC721 {
+ /// @notice A descriptive name for a collection of NFTs in this contract
+ function name() external view returns (string memory _name);
+
+ /// @notice An abbreviated name for NFTs in this contract
+ function symbol() external view returns (string memory _symbol);
+
+ /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+ /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
+ /// 3986. The URI may point to a JSON file that conforms to the "ERC721
+ /// Metadata JSON Schema".
+ function tokenURI(uint256 _tokenId) external view returns (string memory);
+}
+
+/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
+/// Note: the ERC-165 identifier for this interface is 0x780e9d63.
+interface IERC721Enumerable is IERC721 {
+ /// @notice Count NFTs tracked by this contract
+ /// @return A count of valid NFTs tracked by this contract, where each one of
+ /// them has an assigned and queryable owner not equal to the zero address
+ function totalSupply() external view returns (uint256);
+
+ /// @notice Enumerate valid NFTs
+ /// @dev Throws if `_index` >= `totalSupply()`.
+ /// @param _index A counter less than `totalSupply()`
+ /// @return The token identifier for the `_index`th NFT,
+ /// (sort order not specified)
+ function tokenByIndex(uint256 _index) external view returns (uint256);
+
+ /// @notice Enumerate NFTs assigned to an owner
+ /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
+ /// `_owner` is the zero address, representing invalid NFTs.
+ /// @param _owner An address where we are interested in NFTs owned by them
+ /// @param _index A counter less than `balanceOf(_owner)`
+ /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
+ /// (sort order not specified)
+ function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IMulticall3.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IMulticall3.sol
new file mode 100644
index 000000000..0d031b71d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IMulticall3.sol
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+interface IMulticall3 {
+ struct Call {
+ address target;
+ bytes callData;
+ }
+
+ struct Call3 {
+ address target;
+ bool allowFailure;
+ bytes callData;
+ }
+
+ struct Call3Value {
+ address target;
+ bool allowFailure;
+ uint256 value;
+ bytes callData;
+ }
+
+ struct Result {
+ bool success;
+ bytes returnData;
+ }
+
+ function aggregate(Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes[] memory returnData);
+
+ function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);
+
+ function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);
+
+ function blockAndAggregate(Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);
+
+ function getBasefee() external view returns (uint256 basefee);
+
+ function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);
+
+ function getBlockNumber() external view returns (uint256 blockNumber);
+
+ function getChainId() external view returns (uint256 chainid);
+
+ function getCurrentBlockCoinbase() external view returns (address coinbase);
+
+ function getCurrentBlockDifficulty() external view returns (uint256 difficulty);
+
+ function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);
+
+ function getCurrentBlockTimestamp() external view returns (uint256 timestamp);
+
+ function getEthBalance(address addr) external view returns (uint256 balance);
+
+ function getLastBlockHash() external view returns (bytes32 blockHash);
+
+ function tryAggregate(bool requireSuccess, Call[] calldata calls)
+ external
+ payable
+ returns (Result[] memory returnData);
+
+ function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)
+ external
+ payable
+ returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/mocks/MockERC20.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/mocks/MockERC20.sol
new file mode 100644
index 000000000..2a022fa34
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/mocks/MockERC20.sol
@@ -0,0 +1,234 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {IERC20} from "../interfaces/IERC20.sol";
+
+/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production.
+/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol
+contract MockERC20 is IERC20 {
+ /*//////////////////////////////////////////////////////////////
+ METADATA STORAGE
+ //////////////////////////////////////////////////////////////*/
+
+ string internal _name;
+
+ string internal _symbol;
+
+ uint8 internal _decimals;
+
+ function name() external view override returns (string memory) {
+ return _name;
+ }
+
+ function symbol() external view override returns (string memory) {
+ return _symbol;
+ }
+
+ function decimals() external view override returns (uint8) {
+ return _decimals;
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ ERC20 STORAGE
+ //////////////////////////////////////////////////////////////*/
+
+ uint256 internal _totalSupply;
+
+ mapping(address => uint256) internal _balanceOf;
+
+ mapping(address => mapping(address => uint256)) internal _allowance;
+
+ function totalSupply() external view override returns (uint256) {
+ return _totalSupply;
+ }
+
+ function balanceOf(address owner) external view override returns (uint256) {
+ return _balanceOf[owner];
+ }
+
+ function allowance(address owner, address spender) external view override returns (uint256) {
+ return _allowance[owner][spender];
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ EIP-2612 STORAGE
+ //////////////////////////////////////////////////////////////*/
+
+ uint256 internal INITIAL_CHAIN_ID;
+
+ bytes32 internal INITIAL_DOMAIN_SEPARATOR;
+
+ mapping(address => uint256) public nonces;
+
+ /*//////////////////////////////////////////////////////////////
+ INITIALIZE
+ //////////////////////////////////////////////////////////////*/
+
+ /// @dev A bool to track whether the contract has been initialized.
+ bool private initialized;
+
+ /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and
+ /// syntaxes, we add an initialization function that can be called only once.
+ function initialize(string memory name_, string memory symbol_, uint8 decimals_) public {
+ require(!initialized, "ALREADY_INITIALIZED");
+
+ _name = name_;
+ _symbol = symbol_;
+ _decimals = decimals_;
+
+ INITIAL_CHAIN_ID = _pureChainId();
+ INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
+
+ initialized = true;
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ ERC20 LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ function approve(address spender, uint256 amount) public virtual override returns (bool) {
+ _allowance[msg.sender][spender] = amount;
+
+ emit Approval(msg.sender, spender, amount);
+
+ return true;
+ }
+
+ function transfer(address to, uint256 amount) public virtual override returns (bool) {
+ _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount);
+ _balanceOf[to] = _add(_balanceOf[to], amount);
+
+ emit Transfer(msg.sender, to, amount);
+
+ return true;
+ }
+
+ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
+ uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals.
+
+ if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount);
+
+ _balanceOf[from] = _sub(_balanceOf[from], amount);
+ _balanceOf[to] = _add(_balanceOf[to], amount);
+
+ emit Transfer(from, to, amount);
+
+ return true;
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ EIP-2612 LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
+ public
+ virtual
+ {
+ require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
+
+ address recoveredAddress = ecrecover(
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ DOMAIN_SEPARATOR(),
+ keccak256(
+ abi.encode(
+ keccak256(
+ "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
+ ),
+ owner,
+ spender,
+ value,
+ nonces[owner]++,
+ deadline
+ )
+ )
+ )
+ ),
+ v,
+ r,
+ s
+ );
+
+ require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
+
+ _allowance[recoveredAddress][spender] = value;
+
+ emit Approval(owner, spender, value);
+ }
+
+ function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
+ return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
+ }
+
+ function computeDomainSeparator() internal view virtual returns (bytes32) {
+ return keccak256(
+ abi.encode(
+ keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
+ keccak256(bytes(_name)),
+ keccak256("1"),
+ _pureChainId(),
+ address(this)
+ )
+ );
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ INTERNAL MINT/BURN LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ function _mint(address to, uint256 amount) internal virtual {
+ _totalSupply = _add(_totalSupply, amount);
+ _balanceOf[to] = _add(_balanceOf[to], amount);
+
+ emit Transfer(address(0), to, amount);
+ }
+
+ function _burn(address from, uint256 amount) internal virtual {
+ _balanceOf[from] = _sub(_balanceOf[from], amount);
+ _totalSupply = _sub(_totalSupply, amount);
+
+ emit Transfer(from, address(0), amount);
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ INTERNAL SAFE MATH LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ function _add(uint256 a, uint256 b) internal pure returns (uint256) {
+ uint256 c = a + b;
+ require(c >= a, "ERC20: addition overflow");
+ return c;
+ }
+
+ function _sub(uint256 a, uint256 b) internal pure returns (uint256) {
+ require(a >= b, "ERC20: subtraction underflow");
+ return a - b;
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ HELPERS
+ //////////////////////////////////////////////////////////////*/
+
+ // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no
+ // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We
+ // can't simply access the chain ID in a normal view or pure function because the solc View Pure
+ // Checker changed `chainid` from pure to view in 0.8.0.
+ function _viewChainId() private view returns (uint256 chainId) {
+ // Assembly required since `block.chainid` was introduced in 0.8.0.
+ assembly {
+ chainId := chainid()
+ }
+
+ address(this); // Silence warnings in older Solc versions.
+ }
+
+ function _pureChainId() private pure returns (uint256 chainId) {
+ function() internal view returns (uint256) fnIn = _viewChainId;
+ function() internal pure returns (uint256) pureChainId;
+ assembly {
+ pureChainId := fnIn
+ }
+ chainId = pureChainId();
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/mocks/MockERC721.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/mocks/MockERC721.sol
new file mode 100644
index 000000000..7a4909e58
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/mocks/MockERC721.sol
@@ -0,0 +1,231 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+import {IERC721Metadata, IERC721TokenReceiver} from "../interfaces/IERC721.sol";
+
+/// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production.
+/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol
+contract MockERC721 is IERC721Metadata {
+ /*//////////////////////////////////////////////////////////////
+ METADATA STORAGE/LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ string internal _name;
+
+ string internal _symbol;
+
+ function name() external view override returns (string memory) {
+ return _name;
+ }
+
+ function symbol() external view override returns (string memory) {
+ return _symbol;
+ }
+
+ function tokenURI(uint256 id) public view virtual override returns (string memory) {}
+
+ /*//////////////////////////////////////////////////////////////
+ ERC721 BALANCE/OWNER STORAGE
+ //////////////////////////////////////////////////////////////*/
+
+ mapping(uint256 => address) internal _ownerOf;
+
+ mapping(address => uint256) internal _balanceOf;
+
+ function ownerOf(uint256 id) public view virtual override returns (address owner) {
+ require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
+ }
+
+ function balanceOf(address owner) public view virtual override returns (uint256) {
+ require(owner != address(0), "ZERO_ADDRESS");
+
+ return _balanceOf[owner];
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ ERC721 APPROVAL STORAGE
+ //////////////////////////////////////////////////////////////*/
+
+ mapping(uint256 => address) internal _getApproved;
+
+ mapping(address => mapping(address => bool)) internal _isApprovedForAll;
+
+ function getApproved(uint256 id) public view virtual override returns (address) {
+ return _getApproved[id];
+ }
+
+ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
+ return _isApprovedForAll[owner][operator];
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ INITIALIZE
+ //////////////////////////////////////////////////////////////*/
+
+ /// @dev A bool to track whether the contract has been initialized.
+ bool private initialized;
+
+ /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and
+ /// syntaxes, we add an initialization function that can be called only once.
+ function initialize(string memory name_, string memory symbol_) public {
+ require(!initialized, "ALREADY_INITIALIZED");
+
+ _name = name_;
+ _symbol = symbol_;
+
+ initialized = true;
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ ERC721 LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ function approve(address spender, uint256 id) public payable virtual override {
+ address owner = _ownerOf[id];
+
+ require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");
+
+ _getApproved[id] = spender;
+
+ emit Approval(owner, spender, id);
+ }
+
+ function setApprovalForAll(address operator, bool approved) public virtual override {
+ _isApprovedForAll[msg.sender][operator] = approved;
+
+ emit ApprovalForAll(msg.sender, operator, approved);
+ }
+
+ function transferFrom(address from, address to, uint256 id) public payable virtual override {
+ require(from == _ownerOf[id], "WRONG_FROM");
+
+ require(to != address(0), "INVALID_RECIPIENT");
+
+ require(
+ msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id],
+ "NOT_AUTHORIZED"
+ );
+
+ // Underflow of the sender's balance is impossible because we check for
+ // ownership above and the recipient's balance can't realistically overflow.
+ _balanceOf[from]--;
+
+ _balanceOf[to]++;
+
+ _ownerOf[id] = to;
+
+ delete _getApproved[id];
+
+ emit Transfer(from, to, id);
+ }
+
+ function safeTransferFrom(address from, address to, uint256 id) public payable virtual override {
+ transferFrom(from, to, id);
+
+ require(
+ !_isContract(to)
+ || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "")
+ == IERC721TokenReceiver.onERC721Received.selector,
+ "UNSAFE_RECIPIENT"
+ );
+ }
+
+ function safeTransferFrom(address from, address to, uint256 id, bytes memory data)
+ public
+ payable
+ virtual
+ override
+ {
+ transferFrom(from, to, id);
+
+ require(
+ !_isContract(to)
+ || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data)
+ == IERC721TokenReceiver.onERC721Received.selector,
+ "UNSAFE_RECIPIENT"
+ );
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ ERC165 LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
+ return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165
+ || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721
+ || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ INTERNAL MINT/BURN LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ function _mint(address to, uint256 id) internal virtual {
+ require(to != address(0), "INVALID_RECIPIENT");
+
+ require(_ownerOf[id] == address(0), "ALREADY_MINTED");
+
+ // Counter overflow is incredibly unrealistic.
+
+ _balanceOf[to]++;
+
+ _ownerOf[id] = to;
+
+ emit Transfer(address(0), to, id);
+ }
+
+ function _burn(uint256 id) internal virtual {
+ address owner = _ownerOf[id];
+
+ require(owner != address(0), "NOT_MINTED");
+
+ _balanceOf[owner]--;
+
+ delete _ownerOf[id];
+
+ delete _getApproved[id];
+
+ emit Transfer(owner, address(0), id);
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ INTERNAL SAFE MINT LOGIC
+ //////////////////////////////////////////////////////////////*/
+
+ function _safeMint(address to, uint256 id) internal virtual {
+ _mint(to, id);
+
+ require(
+ !_isContract(to)
+ || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "")
+ == IERC721TokenReceiver.onERC721Received.selector,
+ "UNSAFE_RECIPIENT"
+ );
+ }
+
+ function _safeMint(address to, uint256 id, bytes memory data) internal virtual {
+ _mint(to, id);
+
+ require(
+ !_isContract(to)
+ || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data)
+ == IERC721TokenReceiver.onERC721Received.selector,
+ "UNSAFE_RECIPIENT"
+ );
+ }
+
+ /*//////////////////////////////////////////////////////////////
+ HELPERS
+ //////////////////////////////////////////////////////////////*/
+
+ function _isContract(address _addr) private view returns (bool) {
+ uint256 codeLength;
+
+ // Assembly required for versions < 0.8.0 to check extcodesize.
+ assembly {
+ codeLength := extcodesize(_addr)
+ }
+
+ return codeLength > 0;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/safeconsole.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/safeconsole.sol
new file mode 100644
index 000000000..87c475a5b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/safeconsole.sol
@@ -0,0 +1,13937 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+/// @author philogy
+/// @dev Code generated automatically by script.
+library safeconsole {
+ uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67;
+
+ // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374)
+ // for the view-to-pure log trick.
+ function _sendLogPayload(uint256 offset, uint256 size) private pure {
+ function(uint256, uint256) internal view fnIn = _sendLogPayloadView;
+ function(uint256, uint256) internal pure pureSendLogPayload;
+ /// @solidity memory-safe-assembly
+ assembly {
+ pureSendLogPayload := fnIn
+ }
+ pureSendLogPayload(offset, size);
+ }
+
+ function _sendLogPayloadView(uint256 offset, uint256 size) private view {
+ /// @solidity memory-safe-assembly
+ assembly {
+ pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0))
+ }
+ }
+
+ function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure {
+ function(uint256, uint256, uint256) internal view fnIn = _memcopyView;
+ function(uint256, uint256, uint256) internal pure pureMemcopy;
+ /// @solidity memory-safe-assembly
+ assembly {
+ pureMemcopy := fnIn
+ }
+ pureMemcopy(fromOffset, toOffset, length);
+ }
+
+ function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view {
+ /// @solidity memory-safe-assembly
+ assembly {
+ pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length))
+ }
+ }
+
+ function logMemory(uint256 offset, uint256 length) internal pure {
+ if (offset >= 0x60) {
+ // Sufficient memory before slice to prepare call header.
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(sub(offset, 0x60))
+ m1 := mload(sub(offset, 0x40))
+ m2 := mload(sub(offset, 0x20))
+ // Selector of `log(bytes)`.
+ mstore(sub(offset, 0x60), 0x0be77f56)
+ mstore(sub(offset, 0x40), 0x20)
+ mstore(sub(offset, 0x20), length)
+ }
+ _sendLogPayload(offset - 0x44, length + 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(sub(offset, 0x60), m0)
+ mstore(sub(offset, 0x40), m1)
+ mstore(sub(offset, 0x20), m2)
+ }
+ } else {
+ // Insufficient space, so copy slice forward, add header and reverse.
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ uint256 endOffset = offset + length;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(add(endOffset, 0x00))
+ m1 := mload(add(endOffset, 0x20))
+ m2 := mload(add(endOffset, 0x40))
+ }
+ _memcopy(offset, offset + 0x60, length);
+ /// @solidity memory-safe-assembly
+ assembly {
+ // Selector of `log(bytes)`.
+ mstore(add(offset, 0x00), 0x0be77f56)
+ mstore(add(offset, 0x20), 0x20)
+ mstore(add(offset, 0x40), length)
+ }
+ _sendLogPayload(offset + 0x1c, length + 0x44);
+ _memcopy(offset + 0x60, offset, length);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(add(endOffset, 0x00), m0)
+ mstore(add(endOffset, 0x20), m1)
+ mstore(add(endOffset, 0x40), m2)
+ }
+ }
+ }
+
+ function log(address p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(address)`.
+ mstore(0x00, 0x2c2ecbc2)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(bool p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(bool)`.
+ mstore(0x00, 0x32458eed)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(uint256 p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ // Selector of `log(uint256)`.
+ mstore(0x00, 0xf82c50f1)
+ mstore(0x20, p0)
+ }
+ _sendLogPayload(0x1c, 0x24);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ }
+ }
+
+ function log(bytes32 p0) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(string)`.
+ mstore(0x00, 0x41304fac)
+ mstore(0x20, 0x20)
+ writeString(0x40, p0)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,address)`.
+ mstore(0x00, 0xdaf0d4aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,bool)`.
+ mstore(0x00, 0x75b605d3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(address,uint256)`.
+ mstore(0x00, 0x8309e8a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(address p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,string)`.
+ mstore(0x00, 0x759f86bb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,address)`.
+ mstore(0x00, 0x853c4849)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,bool)`.
+ mstore(0x00, 0x2a110e83)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(bool,uint256)`.
+ mstore(0x00, 0x399174d3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(bool p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,string)`.
+ mstore(0x00, 0x8feac525)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,address)`.
+ mstore(0x00, 0x69276c86)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,bool)`.
+ mstore(0x00, 0x1c9d7eb3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ // Selector of `log(uint256,uint256)`.
+ mstore(0x00, 0xf666715a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ }
+ _sendLogPayload(0x1c, 0x44);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,string)`.
+ mstore(0x00, 0x643fd0df)
+ mstore(0x20, p0)
+ mstore(0x40, 0x40)
+ writeString(0x60, p1)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, address p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,address)`.
+ mstore(0x00, 0x319af333)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, bool p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,bool)`.
+ mstore(0x00, 0xc3b55635)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(string,uint256)`.
+ mstore(0x00, 0xb60e72cc)
+ mstore(0x20, 0x40)
+ mstore(0x40, p1)
+ writeString(0x60, p0)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,string)`.
+ mstore(0x00, 0x4b5c4277)
+ mstore(0x20, 0x40)
+ mstore(0x40, 0x80)
+ writeString(0x60, p0)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,address)`.
+ mstore(0x00, 0x018c84c2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,bool)`.
+ mstore(0x00, 0xf2a66286)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,address,uint256)`.
+ mstore(0x00, 0x17fe6185)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,address,string)`.
+ mstore(0x00, 0x007150be)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,address)`.
+ mstore(0x00, 0xf11699ed)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,bool)`.
+ mstore(0x00, 0xeb830c92)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,bool,uint256)`.
+ mstore(0x00, 0x9c4f99fb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,bool,string)`.
+ mstore(0x00, 0x212255cc)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,address)`.
+ mstore(0x00, 0x7bc0d848)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,bool)`.
+ mstore(0x00, 0x678209a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(address,uint256,uint256)`.
+ mstore(0x00, 0xb69bcaf6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,uint256,string)`.
+ mstore(0x00, 0xa1f2e8aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,address)`.
+ mstore(0x00, 0xf08744e8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,bool)`.
+ mstore(0x00, 0xcf020fb1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(address,string,uint256)`.
+ mstore(0x00, 0x67dd6ff1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(address,string,string)`.
+ mstore(0x00, 0xfb772265)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bool p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,address)`.
+ mstore(0x00, 0xd2763667)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,bool)`.
+ mstore(0x00, 0x18c9c746)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,address,uint256)`.
+ mstore(0x00, 0x5f7b9afb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,address,string)`.
+ mstore(0x00, 0xde9a9270)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,address)`.
+ mstore(0x00, 0x1078f68d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,bool)`.
+ mstore(0x00, 0x50709698)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,bool,uint256)`.
+ mstore(0x00, 0x12f21602)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,bool,string)`.
+ mstore(0x00, 0x2555fa46)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,address)`.
+ mstore(0x00, 0x088ef9d2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,bool)`.
+ mstore(0x00, 0xe8defba9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(bool,uint256,uint256)`.
+ mstore(0x00, 0x37103367)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,uint256,string)`.
+ mstore(0x00, 0xc3fc3970)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,address)`.
+ mstore(0x00, 0x9591b953)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,bool)`.
+ mstore(0x00, 0xdbb4c247)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(bool,string,uint256)`.
+ mstore(0x00, 0x1093ee11)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(bool,string,string)`.
+ mstore(0x00, 0xb076847f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,address)`.
+ mstore(0x00, 0xbcfd9be0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,bool)`.
+ mstore(0x00, 0x9b6ec042)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,address,uint256)`.
+ mstore(0x00, 0x5a9b5ed5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,address,string)`.
+ mstore(0x00, 0x63cb41f9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,address)`.
+ mstore(0x00, 0x35085f7b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,bool)`.
+ mstore(0x00, 0x20718650)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,bool,uint256)`.
+ mstore(0x00, 0x20098014)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,bool,string)`.
+ mstore(0x00, 0x85775021)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,address)`.
+ mstore(0x00, 0x5c96b331)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,bool)`.
+ mstore(0x00, 0x4766da72)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ // Selector of `log(uint256,uint256,uint256)`.
+ mstore(0x00, 0xd1ed7a3c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ }
+ _sendLogPayload(0x1c, 0x64);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,uint256,string)`.
+ mstore(0x00, 0x71d04af2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x60)
+ writeString(0x80, p2)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,address)`.
+ mstore(0x00, 0x7afac959)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,bool)`.
+ mstore(0x00, 0x4ceda75a)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(uint256,string,uint256)`.
+ mstore(0x00, 0x37aa7d4c)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, p2)
+ writeString(0x80, p1)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(uint256,string,string)`.
+ mstore(0x00, 0xb115611f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x60)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p1)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,address)`.
+ mstore(0x00, 0xfcec75e0)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,bool)`.
+ mstore(0x00, 0xc91d5ed4)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,address,uint256)`.
+ mstore(0x00, 0x0d26b925)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,address,string)`.
+ mstore(0x00, 0xe0e9ad4f)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,address)`.
+ mstore(0x00, 0x932bbb38)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,bool)`.
+ mstore(0x00, 0x850b7ad6)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,bool,uint256)`.
+ mstore(0x00, 0xc95958d6)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,bool,string)`.
+ mstore(0x00, 0xe298f47d)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,address)`.
+ mstore(0x00, 0x1c7ec448)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,bool)`.
+ mstore(0x00, 0xca7733b1)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ // Selector of `log(string,uint256,uint256)`.
+ mstore(0x00, 0xca47c4eb)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ }
+ _sendLogPayload(0x1c, 0xa4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,uint256,string)`.
+ mstore(0x00, 0x5970e089)
+ mstore(0x20, 0x60)
+ mstore(0x40, p1)
+ mstore(0x60, 0xa0)
+ writeString(0x80, p0)
+ writeString(0xc0, p2)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,address)`.
+ mstore(0x00, 0x95ed0195)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,bool)`.
+ mstore(0x00, 0xb0e0f9b5)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ // Selector of `log(string,string,uint256)`.
+ mstore(0x00, 0x5821efa1)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, p2)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ }
+ _sendLogPayload(0x1c, 0xe4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ // Selector of `log(string,string,string)`.
+ mstore(0x00, 0x2ced7cef)
+ mstore(0x20, 0x60)
+ mstore(0x40, 0xa0)
+ mstore(0x60, 0xe0)
+ writeString(0x80, p0)
+ writeString(0xc0, p1)
+ writeString(0x100, p2)
+ }
+ _sendLogPayload(0x1c, 0x124);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ }
+ }
+
+ function log(address p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,address)`.
+ mstore(0x00, 0x665bf134)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,bool)`.
+ mstore(0x00, 0x0e378994)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,address,uint256)`.
+ mstore(0x00, 0x94250d77)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,address,string)`.
+ mstore(0x00, 0xf808da20)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,address)`.
+ mstore(0x00, 0x9f1bc36e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,bool)`.
+ mstore(0x00, 0x2cd4134a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,bool,uint256)`.
+ mstore(0x00, 0x3971e78c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,bool,string)`.
+ mstore(0x00, 0xaa6540c8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,address)`.
+ mstore(0x00, 0x8da6def5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,bool)`.
+ mstore(0x00, 0x9b4254e2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,address,uint256,uint256)`.
+ mstore(0x00, 0xbe553481)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,uint256,string)`.
+ mstore(0x00, 0xfdb4f990)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,address)`.
+ mstore(0x00, 0x8f736d16)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,bool)`.
+ mstore(0x00, 0x6f1a594e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,address,string,uint256)`.
+ mstore(0x00, 0xef1cefe7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,address,string,string)`.
+ mstore(0x00, 0x21bdaf25)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,address)`.
+ mstore(0x00, 0x660375dd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,bool)`.
+ mstore(0x00, 0xa6f50b0f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,address,uint256)`.
+ mstore(0x00, 0xa75c59de)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,address,string)`.
+ mstore(0x00, 0x2dd778e6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,address)`.
+ mstore(0x00, 0xcf394485)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,bool)`.
+ mstore(0x00, 0xcac43479)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,bool,uint256)`.
+ mstore(0x00, 0x8c4e5de6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,bool,string)`.
+ mstore(0x00, 0xdfc4a2e8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,address)`.
+ mstore(0x00, 0xccf790a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,bool)`.
+ mstore(0x00, 0xc4643e20)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,bool,uint256,uint256)`.
+ mstore(0x00, 0x386ff5f4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,uint256,string)`.
+ mstore(0x00, 0x0aa6cfad)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,address)`.
+ mstore(0x00, 0x19fd4956)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,bool)`.
+ mstore(0x00, 0x50ad461d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,bool,string,uint256)`.
+ mstore(0x00, 0x80e6a20b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,bool,string,string)`.
+ mstore(0x00, 0x475c5c33)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,address)`.
+ mstore(0x00, 0x478d1c62)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,bool)`.
+ mstore(0x00, 0xa1bcc9b3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,address,uint256)`.
+ mstore(0x00, 0x100f650e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,address,string)`.
+ mstore(0x00, 0x1da986ea)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,address)`.
+ mstore(0x00, 0xa31bfdcc)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,bool)`.
+ mstore(0x00, 0x3bf5e537)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,bool,uint256)`.
+ mstore(0x00, 0x22f6b999)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,bool,string)`.
+ mstore(0x00, 0xc5ad85f9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,address)`.
+ mstore(0x00, 0x20e3984d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,bool)`.
+ mstore(0x00, 0x66f1bc67)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(address,uint256,uint256,uint256)`.
+ mstore(0x00, 0x34f0e636)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,uint256,string)`.
+ mstore(0x00, 0x4a28c017)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,address)`.
+ mstore(0x00, 0x5c430d47)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,bool)`.
+ mstore(0x00, 0xcf18105c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,uint256,string,uint256)`.
+ mstore(0x00, 0xbf01f891)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,uint256,string,string)`.
+ mstore(0x00, 0x88a8c406)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,address)`.
+ mstore(0x00, 0x0d36fa20)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,bool)`.
+ mstore(0x00, 0x0df12b76)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,address,uint256)`.
+ mstore(0x00, 0x457fe3cf)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,address,string)`.
+ mstore(0x00, 0xf7e36245)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,address)`.
+ mstore(0x00, 0x205871c2)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,bool)`.
+ mstore(0x00, 0x5f1d5c9f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,bool,uint256)`.
+ mstore(0x00, 0x515e38b6)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,bool,string)`.
+ mstore(0x00, 0xbc0b61fe)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,address)`.
+ mstore(0x00, 0x63183678)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,bool)`.
+ mstore(0x00, 0x0ef7e050)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(address,string,uint256,uint256)`.
+ mstore(0x00, 0x1dc8e1b8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,uint256,string)`.
+ mstore(0x00, 0x448830a8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,address)`.
+ mstore(0x00, 0xa04e2f87)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,bool)`.
+ mstore(0x00, 0x35a5071f)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(address,string,string,uint256)`.
+ mstore(0x00, 0x159f8927)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(address,string,string,string)`.
+ mstore(0x00, 0x5d02c50b)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,address)`.
+ mstore(0x00, 0x1d14d001)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,bool)`.
+ mstore(0x00, 0x46600be0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,address,uint256)`.
+ mstore(0x00, 0x0c66d1be)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,address,string)`.
+ mstore(0x00, 0xd812a167)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,address)`.
+ mstore(0x00, 0x1c41a336)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,bool)`.
+ mstore(0x00, 0x6a9c478b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,bool,uint256)`.
+ mstore(0x00, 0x07831502)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,bool,string)`.
+ mstore(0x00, 0x4a66cb34)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,address)`.
+ mstore(0x00, 0x136b05dd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,bool)`.
+ mstore(0x00, 0xd6019f1c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,address,uint256,uint256)`.
+ mstore(0x00, 0x7bf181a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,uint256,string)`.
+ mstore(0x00, 0x51f09ff8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,address)`.
+ mstore(0x00, 0x6f7c603e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,bool)`.
+ mstore(0x00, 0xe2bfd60b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,address,string,uint256)`.
+ mstore(0x00, 0xc21f64c7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,address,string,string)`.
+ mstore(0x00, 0xa73c1db6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,address)`.
+ mstore(0x00, 0xf4880ea4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,bool)`.
+ mstore(0x00, 0xc0a302d8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,address,uint256)`.
+ mstore(0x00, 0x4c123d57)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,address,string)`.
+ mstore(0x00, 0xa0a47963)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,address)`.
+ mstore(0x00, 0x8c329b1a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,bool)`.
+ mstore(0x00, 0x3b2a5ce0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,bool,uint256)`.
+ mstore(0x00, 0x6d7045c1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,bool,string)`.
+ mstore(0x00, 0x2ae408d4)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,address)`.
+ mstore(0x00, 0x54a7a9a0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,bool)`.
+ mstore(0x00, 0x619e4d0e)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,bool,uint256,uint256)`.
+ mstore(0x00, 0x0bb00eab)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,uint256,string)`.
+ mstore(0x00, 0x7dd4d0e0)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,address)`.
+ mstore(0x00, 0xf9ad2b89)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,bool)`.
+ mstore(0x00, 0xb857163a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,bool,string,uint256)`.
+ mstore(0x00, 0xe3a9ca2f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,bool,string,string)`.
+ mstore(0x00, 0x6d1e8751)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,address)`.
+ mstore(0x00, 0x26f560a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,bool)`.
+ mstore(0x00, 0xb4c314ff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,address,uint256)`.
+ mstore(0x00, 0x1537dc87)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,address,string)`.
+ mstore(0x00, 0x1bb3b09a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,address)`.
+ mstore(0x00, 0x9acd3616)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,bool)`.
+ mstore(0x00, 0xceb5f4d7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,bool,uint256)`.
+ mstore(0x00, 0x7f9bbca2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,bool,string)`.
+ mstore(0x00, 0x9143dbb1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,address)`.
+ mstore(0x00, 0x00dd87b9)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,bool)`.
+ mstore(0x00, 0xbe984353)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(bool,uint256,uint256,uint256)`.
+ mstore(0x00, 0x374bb4b2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,uint256,string)`.
+ mstore(0x00, 0x8e69fb5d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,address)`.
+ mstore(0x00, 0xfedd1fff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,bool)`.
+ mstore(0x00, 0xe5e70b2b)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,uint256,string,uint256)`.
+ mstore(0x00, 0x6a1199e2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,uint256,string,string)`.
+ mstore(0x00, 0xf5bc2249)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,address)`.
+ mstore(0x00, 0x2b2b18dc)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,bool)`.
+ mstore(0x00, 0x6dd434ca)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,address,uint256)`.
+ mstore(0x00, 0xa5cada94)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,address,string)`.
+ mstore(0x00, 0x12d6c788)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,address)`.
+ mstore(0x00, 0x538e06ab)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,bool)`.
+ mstore(0x00, 0xdc5e935b)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,bool,uint256)`.
+ mstore(0x00, 0x1606a393)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,bool,string)`.
+ mstore(0x00, 0x483d0416)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,address)`.
+ mstore(0x00, 0x1596a1ce)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,bool)`.
+ mstore(0x00, 0x6b0e5d53)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(bool,string,uint256,uint256)`.
+ mstore(0x00, 0x28863fcb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,uint256,string)`.
+ mstore(0x00, 0x1ad96de6)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,address)`.
+ mstore(0x00, 0x97d394d8)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,bool)`.
+ mstore(0x00, 0x1e4b87e5)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(bool,string,string,uint256)`.
+ mstore(0x00, 0x7be0c3eb)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(bool,string,string,string)`.
+ mstore(0x00, 0x1762e32a)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,address)`.
+ mstore(0x00, 0x2488b414)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,bool)`.
+ mstore(0x00, 0x091ffaf5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,address,uint256)`.
+ mstore(0x00, 0x736efbb6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,address,string)`.
+ mstore(0x00, 0x031c6f73)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,address)`.
+ mstore(0x00, 0xef72c513)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,bool)`.
+ mstore(0x00, 0xe351140f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,bool,uint256)`.
+ mstore(0x00, 0x5abd992a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,bool,string)`.
+ mstore(0x00, 0x90fb06aa)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,address)`.
+ mstore(0x00, 0x15c127b5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,bool)`.
+ mstore(0x00, 0x5f743a7c)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,address,uint256,uint256)`.
+ mstore(0x00, 0x0c9cd9c1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,uint256,string)`.
+ mstore(0x00, 0xddb06521)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,address)`.
+ mstore(0x00, 0x9cba8fff)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,bool)`.
+ mstore(0x00, 0xcc32ab07)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,address,string,uint256)`.
+ mstore(0x00, 0x46826b5d)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,address,string,string)`.
+ mstore(0x00, 0x3e128ca3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,address)`.
+ mstore(0x00, 0xa1ef4cbb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,bool)`.
+ mstore(0x00, 0x454d54a5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,address,uint256)`.
+ mstore(0x00, 0x078287f5)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,address,string)`.
+ mstore(0x00, 0xade052c7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,address)`.
+ mstore(0x00, 0x69640b59)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,bool)`.
+ mstore(0x00, 0xb6f577a1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,bool,uint256)`.
+ mstore(0x00, 0x7464ce23)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,bool,string)`.
+ mstore(0x00, 0xdddb9561)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,address)`.
+ mstore(0x00, 0x88cb6041)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,bool)`.
+ mstore(0x00, 0x91a02e2a)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,bool,uint256,uint256)`.
+ mstore(0x00, 0xc6acc7a8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,uint256,string)`.
+ mstore(0x00, 0xde03e774)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,address)`.
+ mstore(0x00, 0xef529018)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,bool)`.
+ mstore(0x00, 0xeb928d7f)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,bool,string,uint256)`.
+ mstore(0x00, 0x2c1d0746)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,bool,string,string)`.
+ mstore(0x00, 0x68c8b8bd)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,address)`.
+ mstore(0x00, 0x56a5d1b1)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,bool)`.
+ mstore(0x00, 0x15cac476)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,address,uint256)`.
+ mstore(0x00, 0x88f6e4b2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,address,string)`.
+ mstore(0x00, 0x6cde40b8)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,address)`.
+ mstore(0x00, 0x9a816a83)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,bool)`.
+ mstore(0x00, 0xab085ae6)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,bool,uint256)`.
+ mstore(0x00, 0xeb7f6fd2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,bool,string)`.
+ mstore(0x00, 0xa5b4fc99)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,address)`.
+ mstore(0x00, 0xfa8185af)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,bool)`.
+ mstore(0x00, 0xc598d185)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ /// @solidity memory-safe-assembly
+ assembly {
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ // Selector of `log(uint256,uint256,uint256,uint256)`.
+ mstore(0x00, 0x193fb800)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ }
+ _sendLogPayload(0x1c, 0x84);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,uint256,string)`.
+ mstore(0x00, 0x59cfcbe3)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0x80)
+ writeString(0xa0, p3)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,address)`.
+ mstore(0x00, 0x42d21db7)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,bool)`.
+ mstore(0x00, 0x7af6ab25)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,uint256,string,uint256)`.
+ mstore(0x00, 0x5da297eb)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, p3)
+ writeString(0xa0, p2)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,uint256,string,string)`.
+ mstore(0x00, 0x27d8afd2)
+ mstore(0x20, p0)
+ mstore(0x40, p1)
+ mstore(0x60, 0x80)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p2)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,address)`.
+ mstore(0x00, 0x6168ed61)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,bool)`.
+ mstore(0x00, 0x90c30a56)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,address,uint256)`.
+ mstore(0x00, 0xe8d3018d)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,address,string)`.
+ mstore(0x00, 0x9c3adfa1)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,address)`.
+ mstore(0x00, 0xae2ec581)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,bool)`.
+ mstore(0x00, 0xba535d9c)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,bool,uint256)`.
+ mstore(0x00, 0xcf009880)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,bool,string)`.
+ mstore(0x00, 0xd2d423cd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,address)`.
+ mstore(0x00, 0x3b2279b4)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,bool)`.
+ mstore(0x00, 0x691a8f74)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(uint256,string,uint256,uint256)`.
+ mstore(0x00, 0x82c25b74)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,uint256,string)`.
+ mstore(0x00, 0xb7b914ca)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p1)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,address)`.
+ mstore(0x00, 0xd583c602)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,bool)`.
+ mstore(0x00, 0xb3a6b6bd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(uint256,string,string,uint256)`.
+ mstore(0x00, 0xb028c9bd)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(uint256,string,string,string)`.
+ mstore(0x00, 0x21ad0683)
+ mstore(0x20, p0)
+ mstore(0x40, 0x80)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p1)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,address)`.
+ mstore(0x00, 0xed8f28f6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,bool)`.
+ mstore(0x00, 0xb59dbd60)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,address,uint256)`.
+ mstore(0x00, 0x8ef3f399)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,address,string)`.
+ mstore(0x00, 0x800a1c67)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,address)`.
+ mstore(0x00, 0x223603bd)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,bool)`.
+ mstore(0x00, 0x79884c2b)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,bool,uint256)`.
+ mstore(0x00, 0x3e9f866a)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,bool,string)`.
+ mstore(0x00, 0x0454c079)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,address)`.
+ mstore(0x00, 0x63fb8bc5)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,bool)`.
+ mstore(0x00, 0xfc4845f0)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,address,uint256,uint256)`.
+ mstore(0x00, 0xf8f51b1e)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,uint256,string)`.
+ mstore(0x00, 0x5a477632)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,address)`.
+ mstore(0x00, 0xaabc9a31)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,bool)`.
+ mstore(0x00, 0x5f15d28c)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,address,string,uint256)`.
+ mstore(0x00, 0x91d1112e)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,address,string,string)`.
+ mstore(0x00, 0x245986f2)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,address)`.
+ mstore(0x00, 0x33e9dd1d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,bool)`.
+ mstore(0x00, 0x958c28c6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,address,uint256)`.
+ mstore(0x00, 0x5d08bb05)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,address,string)`.
+ mstore(0x00, 0x2d8e33a4)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,address)`.
+ mstore(0x00, 0x7190a529)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,bool)`.
+ mstore(0x00, 0x895af8c5)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,bool,uint256)`.
+ mstore(0x00, 0x8e3f78a9)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,bool,string)`.
+ mstore(0x00, 0x9d22d5dd)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,address)`.
+ mstore(0x00, 0x935e09bf)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,bool)`.
+ mstore(0x00, 0x8af7cf8a)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,bool,uint256,uint256)`.
+ mstore(0x00, 0x64b5bb67)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,uint256,string)`.
+ mstore(0x00, 0x742d6ee7)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,address)`.
+ mstore(0x00, 0xe0625b29)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,bool)`.
+ mstore(0x00, 0x3f8a701d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,bool,string,uint256)`.
+ mstore(0x00, 0x24f91465)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,bool,string,string)`.
+ mstore(0x00, 0xa826caeb)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,address)`.
+ mstore(0x00, 0x5ea2b7ae)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,bool)`.
+ mstore(0x00, 0x82112a42)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,address,uint256)`.
+ mstore(0x00, 0x4f04fdc6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,address,string)`.
+ mstore(0x00, 0x9ffb2f93)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,address)`.
+ mstore(0x00, 0xe0e95b98)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,bool)`.
+ mstore(0x00, 0x354c36d6)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,bool,uint256)`.
+ mstore(0x00, 0xe41b6f6f)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,bool,string)`.
+ mstore(0x00, 0xabf73a98)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,address)`.
+ mstore(0x00, 0xe21de278)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,bool)`.
+ mstore(0x00, 0x7626db92)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ // Selector of `log(string,uint256,uint256,uint256)`.
+ mstore(0x00, 0xa7a87853)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ }
+ _sendLogPayload(0x1c, 0xc4);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,uint256,string)`.
+ mstore(0x00, 0x854b3496)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, p2)
+ mstore(0x80, 0xc0)
+ writeString(0xa0, p0)
+ writeString(0xe0, p3)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,address)`.
+ mstore(0x00, 0x7c4632a4)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,bool)`.
+ mstore(0x00, 0x7d24491d)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,uint256,string,uint256)`.
+ mstore(0x00, 0xc67ea9d1)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,uint256,string,string)`.
+ mstore(0x00, 0x5ab84e1f)
+ mstore(0x20, 0x80)
+ mstore(0x40, p1)
+ mstore(0x60, 0xc0)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p2)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,address)`.
+ mstore(0x00, 0x439c7bef)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,bool)`.
+ mstore(0x00, 0x5ccd4e37)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,address,uint256)`.
+ mstore(0x00, 0x7cc3c607)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,address,string)`.
+ mstore(0x00, 0xeb1bff80)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,address)`.
+ mstore(0x00, 0xc371c7db)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,bool)`.
+ mstore(0x00, 0x40785869)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,bool,uint256)`.
+ mstore(0x00, 0xd6aefad2)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,bool,string)`.
+ mstore(0x00, 0x5e84b0ea)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,address)`.
+ mstore(0x00, 0x1023f7b2)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,bool)`.
+ mstore(0x00, 0xc3a8a654)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ // Selector of `log(string,string,uint256,uint256)`.
+ mstore(0x00, 0xf45d7d2c)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ }
+ _sendLogPayload(0x1c, 0x104);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,uint256,string)`.
+ mstore(0x00, 0x5d1a971a)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, p2)
+ mstore(0x80, 0x100)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p3)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,address)`.
+ mstore(0x00, 0x6d572f44)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,bool)`.
+ mstore(0x00, 0x2c1754ed)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ // Selector of `log(string,string,string,uint256)`.
+ mstore(0x00, 0x8eafb02b)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, p3)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ }
+ _sendLogPayload(0x1c, 0x144);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ }
+ }
+
+ function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure {
+ bytes32 m0;
+ bytes32 m1;
+ bytes32 m2;
+ bytes32 m3;
+ bytes32 m4;
+ bytes32 m5;
+ bytes32 m6;
+ bytes32 m7;
+ bytes32 m8;
+ bytes32 m9;
+ bytes32 m10;
+ bytes32 m11;
+ bytes32 m12;
+ /// @solidity memory-safe-assembly
+ assembly {
+ function writeString(pos, w) {
+ let length := 0
+ for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } }
+ mstore(pos, length)
+ let shift := sub(256, shl(3, length))
+ mstore(add(pos, 0x20), shl(shift, shr(shift, w)))
+ }
+ m0 := mload(0x00)
+ m1 := mload(0x20)
+ m2 := mload(0x40)
+ m3 := mload(0x60)
+ m4 := mload(0x80)
+ m5 := mload(0xa0)
+ m6 := mload(0xc0)
+ m7 := mload(0xe0)
+ m8 := mload(0x100)
+ m9 := mload(0x120)
+ m10 := mload(0x140)
+ m11 := mload(0x160)
+ m12 := mload(0x180)
+ // Selector of `log(string,string,string,string)`.
+ mstore(0x00, 0xde68f20a)
+ mstore(0x20, 0x80)
+ mstore(0x40, 0xc0)
+ mstore(0x60, 0x100)
+ mstore(0x80, 0x140)
+ writeString(0xa0, p0)
+ writeString(0xe0, p1)
+ writeString(0x120, p2)
+ writeString(0x160, p3)
+ }
+ _sendLogPayload(0x1c, 0x184);
+ /// @solidity memory-safe-assembly
+ assembly {
+ mstore(0x00, m0)
+ mstore(0x20, m1)
+ mstore(0x40, m2)
+ mstore(0x60, m3)
+ mstore(0x80, m4)
+ mstore(0xa0, m5)
+ mstore(0xc0, m6)
+ mstore(0xe0, m7)
+ mstore(0x100, m8)
+ mstore(0x120, m9)
+ mstore(0x140, m10)
+ mstore(0x160, m11)
+ mstore(0x180, m12)
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdAssertions.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdAssertions.t.sol
new file mode 100644
index 000000000..9385a607a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdAssertions.t.sol
@@ -0,0 +1,145 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {StdAssertions} from "../src/StdAssertions.sol";
+import {Vm} from "../src/Vm.sol";
+
+interface VmInternal is Vm {
+ function _expectCheatcodeRevert(bytes memory message) external;
+}
+
+contract StdAssertionsTest is StdAssertions {
+ string constant errorMessage = "User provided message";
+ uint256 constant maxDecimals = 77;
+
+ bool constant SHOULD_REVERT = true;
+ bool constant SHOULD_RETURN = false;
+
+ bool constant STRICT_REVERT_DATA = true;
+ bool constant NON_STRICT_REVERT_DATA = false;
+
+ VmInternal constant vm = VmInternal(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ function testFuzz_AssertEqCall_Return_Pass(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnData,
+ bool strictRevertData
+ ) external {
+ address targetA = address(new TestMockCall(returnData, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnData, SHOULD_RETURN));
+
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Return_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnDataA,
+ bytes memory returnDataB,
+ bool strictRevertData
+ ) external {
+ vm.assume(keccak256(returnDataA) != keccak256(returnDataB));
+
+ address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN));
+
+ vm._expectCheatcodeRevert(
+ bytes(
+ string.concat(
+ "Call return data does not match: ", vm.toString(returnDataA), " != ", vm.toString(returnDataB)
+ )
+ )
+ );
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+
+ function testFuzz_AssertEqCall_Revert_Pass(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory revertDataA,
+ bytes memory revertDataB
+ ) external {
+ address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT));
+ address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT));
+
+ assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Revert_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory revertDataA,
+ bytes memory revertDataB
+ ) external {
+ vm.assume(keccak256(revertDataA) != keccak256(revertDataB));
+
+ address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT));
+ address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT));
+
+ vm._expectCheatcodeRevert(
+ bytes(
+ string.concat(
+ "Call revert data does not match: ", vm.toString(revertDataA), " != ", vm.toString(revertDataB)
+ )
+ )
+ );
+ assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA);
+ }
+
+ function testFuzz_RevertWhenCalled_AssertEqCall_Fail(
+ bytes memory callDataA,
+ bytes memory callDataB,
+ bytes memory returnDataA,
+ bytes memory returnDataB,
+ bool strictRevertData
+ ) external {
+ address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN));
+ address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT));
+
+ vm.expectRevert(bytes("assertion failed"));
+ this.assertEqCallExternal(targetA, callDataA, targetB, callDataB, strictRevertData);
+
+ vm.expectRevert(bytes("assertion failed"));
+ this.assertEqCallExternal(targetB, callDataB, targetA, callDataA, strictRevertData);
+ }
+
+ // Helper function to test outcome of assertEqCall via `expect` cheatcodes
+ function assertEqCallExternal(
+ address targetA,
+ bytes memory callDataA,
+ address targetB,
+ bytes memory callDataB,
+ bool strictRevertData
+ ) public {
+ assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData);
+ }
+
+ function testFailFail() public {
+ fail();
+ }
+}
+
+contract TestMockCall {
+ bytes returnData;
+ bool shouldRevert;
+
+ constructor(bytes memory returnData_, bool shouldRevert_) {
+ returnData = returnData_;
+ shouldRevert = shouldRevert_;
+ }
+
+ fallback() external payable {
+ bytes memory returnData_ = returnData;
+
+ if (shouldRevert) {
+ assembly {
+ revert(add(returnData_, 0x20), mload(returnData_))
+ }
+ } else {
+ assembly {
+ return(add(returnData_, 0x20), mload(returnData_))
+ }
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdChains.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdChains.t.sol
new file mode 100644
index 000000000..48130da5c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdChains.t.sol
@@ -0,0 +1,228 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test} from "../src/Test.sol";
+
+contract StdChainsMock is Test {
+ function exposed_getChain(string memory chainAlias) public returns (Chain memory) {
+ return getChain(chainAlias);
+ }
+
+ function exposed_getChain(uint256 chainId) public returns (Chain memory) {
+ return getChain(chainId);
+ }
+
+ function exposed_setChain(string memory chainAlias, ChainData memory chainData) public {
+ setChain(chainAlias, chainData);
+ }
+
+ function exposed_setFallbackToDefaultRpcUrls(bool useDefault) public {
+ setFallbackToDefaultRpcUrls(useDefault);
+ }
+}
+
+contract StdChainsTest is Test {
+ function test_ChainRpcInitialization() public {
+ // RPCs specified in `foundry.toml` should be updated.
+ assertEq(getChain(1).rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX");
+ assertEq(getChain("optimism_sepolia").rpcUrl, "https://sepolia.optimism.io/");
+ assertEq(getChain("arbitrum_one_sepolia").rpcUrl, "https://sepolia-rollup.arbitrum.io/rpc/");
+
+ // Environment variables should be the next fallback
+ assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc");
+ vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride");
+ assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride");
+ vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc");
+
+ // Cannot override RPCs defined in `foundry.toml`
+ vm.setEnv("MAINNET_RPC_URL", "myoverride2");
+ assertEq(getChain("mainnet").rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX");
+
+ // Other RPCs should remain unchanged.
+ assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545");
+ assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001");
+ }
+
+ // Named with a leading underscore to clarify this is not intended to be run as a normal test,
+ // and is intended to be used in the below `test_Rpcs` test.
+ function _testRpc(string memory rpcAlias) internal {
+ string memory rpcUrl = getChain(rpcAlias).rpcUrl;
+ vm.createSelectFork(rpcUrl);
+ }
+
+ // Ensure we can connect to the default RPC URL for each chain.
+ // Currently commented out since this is slow and public RPCs are flaky, often resulting in failing CI.
+ // function test_Rpcs() public {
+ // _testRpc("mainnet");
+ // _testRpc("sepolia");
+ // _testRpc("holesky");
+ // _testRpc("optimism");
+ // _testRpc("optimism_sepolia");
+ // _testRpc("arbitrum_one");
+ // _testRpc("arbitrum_one_sepolia");
+ // _testRpc("arbitrum_nova");
+ // _testRpc("polygon");
+ // _testRpc("polygon_amoy");
+ // _testRpc("avalanche");
+ // _testRpc("avalanche_fuji");
+ // _testRpc("bnb_smart_chain");
+ // _testRpc("bnb_smart_chain_testnet");
+ // _testRpc("gnosis_chain");
+ // _testRpc("moonbeam");
+ // _testRpc("moonriver");
+ // _testRpc("moonbase");
+ // _testRpc("base_sepolia");
+ // _testRpc("base");
+ // _testRpc("blast_sepolia");
+ // _testRpc("blast");
+ // _testRpc("fantom_opera");
+ // _testRpc("fantom_opera_testnet");
+ // _testRpc("fraxtal");
+ // _testRpc("fraxtal_testnet");
+ // _testRpc("berachain_bartio_testnet");
+ // _testRpc("flare");
+ // _testRpc("flare_coston2");
+ // }
+
+ function test_RevertIf_ChainNotFound() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found.");
+ stdChainsMock.exposed_getChain("does_not_exist");
+ }
+
+ function test_RevertIf_SetChain_ChainIdExist_FirstTest() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\".");
+ stdChainsMock.exposed_setChain("anvil2", ChainData("Anvil", 31337, "URL"));
+ }
+
+ function test_RevertIf_ChainBubbleUp() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ stdChainsMock.exposed_setChain("needs_undefined_env_var", ChainData("", 123456789, ""));
+ vm.expectRevert(
+ "Failed to resolve env var `UNDEFINED_RPC_URL_PLACEHOLDER` in `${UNDEFINED_RPC_URL_PLACEHOLDER}`: environment variable not found"
+ );
+ stdChainsMock.exposed_getChain("needs_undefined_env_var");
+ }
+
+ function test_RevertIf_SetChain_ChainIdExists_SecondTest() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ stdChainsMock.exposed_setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+
+ vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".');
+
+ stdChainsMock.exposed_setChain("another_custom_chain", ChainData("", 123456789, ""));
+ }
+
+ function test_SetChain() public {
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+ Chain memory customChain = getChain("custom_chain");
+ assertEq(customChain.name, "Custom Chain");
+ assertEq(customChain.chainId, 123456789);
+ assertEq(customChain.chainAlias, "custom_chain");
+ assertEq(customChain.rpcUrl, "https://custom.chain/");
+ Chain memory chainById = getChain(123456789);
+ assertEq(chainById.name, customChain.name);
+ assertEq(chainById.chainId, customChain.chainId);
+ assertEq(chainById.chainAlias, customChain.chainAlias);
+ assertEq(chainById.rpcUrl, customChain.rpcUrl);
+ customChain.name = "Another Custom Chain";
+ customChain.chainId = 987654321;
+ setChain("another_custom_chain", customChain);
+ Chain memory anotherCustomChain = getChain("another_custom_chain");
+ assertEq(anotherCustomChain.name, "Another Custom Chain");
+ assertEq(anotherCustomChain.chainId, 987654321);
+ assertEq(anotherCustomChain.chainAlias, "another_custom_chain");
+ assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/");
+ // Verify the first chain data was not overwritten
+ chainById = getChain(123456789);
+ assertEq(chainById.name, "Custom Chain");
+ assertEq(chainById.chainId, 123456789);
+ }
+
+ function test_RevertIf_SetEmptyAlias() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string.");
+ stdChainsMock.exposed_setChain("", ChainData("", 123456789, ""));
+ }
+
+ function test_RevertIf_SetNoChainId0() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0.");
+ stdChainsMock.exposed_setChain("alias", ChainData("", 0, ""));
+ }
+
+ function test_RevertIf_GetNoChainId0() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0.");
+ stdChainsMock.exposed_getChain(0);
+ }
+
+ function test_RevertIf_GetNoEmptyAlias() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string.");
+ stdChainsMock.exposed_getChain("");
+ }
+
+ function test_RevertIf_ChainIdNotFound() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found.");
+ stdChainsMock.exposed_getChain("no_such_alias");
+ }
+
+ function test_RevertIf_ChainAliasNotFound() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found.");
+
+ stdChainsMock.exposed_getChain(321);
+ }
+
+ function test_SetChain_ExistingOne() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
+ assertEq(getChain(123456789).chainId, 123456789);
+
+ setChain("custom_chain", ChainData("Modified Chain", 999999999, "https://modified.chain/"));
+ vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found.");
+ stdChainsMock.exposed_getChain(123456789);
+
+ Chain memory modifiedChain = getChain(999999999);
+ assertEq(modifiedChain.name, "Modified Chain");
+ assertEq(modifiedChain.chainId, 999999999);
+ assertEq(modifiedChain.rpcUrl, "https://modified.chain/");
+ }
+
+ function test_RevertIf_DontUseDefaultRpcUrl() public {
+ // We deploy a mock to properly test the revert.
+ StdChainsMock stdChainsMock = new StdChainsMock();
+
+ // Should error if default RPCs flag is set to false.
+ stdChainsMock.exposed_setFallbackToDefaultRpcUrls(false);
+ vm.expectRevert();
+ stdChainsMock.exposed_getChain(31337);
+ vm.expectRevert();
+ stdChainsMock.exposed_getChain("sepolia");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdCheats.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdCheats.t.sol
new file mode 100644
index 000000000..0a5a83237
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdCheats.t.sol
@@ -0,0 +1,618 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {StdCheats} from "../src/StdCheats.sol";
+import {Test} from "../src/Test.sol";
+import {stdJson} from "../src/StdJson.sol";
+import {stdToml} from "../src/StdToml.sol";
+import {IERC20} from "../src/interfaces/IERC20.sol";
+
+contract StdCheatsTest is Test {
+ Bar test;
+
+ using stdJson for string;
+
+ function setUp() public {
+ test = new Bar();
+ }
+
+ function test_Skip() public {
+ vm.warp(100);
+ skip(25);
+ assertEq(block.timestamp, 125);
+ }
+
+ function test_Rewind() public {
+ vm.warp(100);
+ rewind(25);
+ assertEq(block.timestamp, 75);
+ }
+
+ function test_Hoax() public {
+ hoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ }
+
+ function test_HoaxOrigin() public {
+ hoax(address(1337), address(1337));
+ test.origin{value: 100}(address(1337));
+ }
+
+ function test_HoaxDifferentAddresses() public {
+ hoax(address(1337), address(7331));
+ test.origin{value: 100}(address(1337), address(7331));
+ }
+
+ function test_StartHoax() public {
+ startHoax(address(1337));
+ test.bar{value: 100}(address(1337));
+ test.bar{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+
+ function test_StartHoaxOrigin() public {
+ startHoax(address(1337), address(1337));
+ test.origin{value: 100}(address(1337));
+ test.origin{value: 100}(address(1337));
+ vm.stopPrank();
+ test.bar(address(this));
+ }
+
+ function test_ChangePrankMsgSender() public {
+ vm.startPrank(address(1337));
+ test.bar(address(1337));
+ changePrank(address(0xdead));
+ test.bar(address(0xdead));
+ changePrank(address(1337));
+ test.bar(address(1337));
+ vm.stopPrank();
+ }
+
+ function test_ChangePrankMsgSenderAndTxOrigin() public {
+ vm.startPrank(address(1337), address(1338));
+ test.origin(address(1337), address(1338));
+ changePrank(address(0xdead), address(0xbeef));
+ test.origin(address(0xdead), address(0xbeef));
+ changePrank(address(1337), address(1338));
+ test.origin(address(1337), address(1338));
+ vm.stopPrank();
+ }
+
+ function test_MakeAccountEquivalence() public {
+ Account memory account = makeAccount("1337");
+ (address addr, uint256 key) = makeAddrAndKey("1337");
+ assertEq(account.addr, addr);
+ assertEq(account.key, key);
+ }
+
+ function test_MakeAddrEquivalence() public {
+ (address addr,) = makeAddrAndKey("1337");
+ assertEq(makeAddr("1337"), addr);
+ }
+
+ function test_MakeAddrSigning() public {
+ (address addr, uint256 key) = makeAddrAndKey("1337");
+ bytes32 hash = keccak256("some_message");
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash);
+ assertEq(ecrecover(hash, v, r, s), addr);
+ }
+
+ function test_Deal() public {
+ deal(address(this), 1 ether);
+ assertEq(address(this).balance, 1 ether);
+ }
+
+ function test_DealToken() public {
+ Bar barToken = new Bar();
+ address bar = address(barToken);
+ deal(bar, address(this), 10000e18);
+ assertEq(barToken.balanceOf(address(this)), 10000e18);
+ }
+
+ function test_DealTokenAdjustTotalSupply() public {
+ Bar barToken = new Bar();
+ address bar = address(barToken);
+ deal(bar, address(this), 10000e18, true);
+ assertEq(barToken.balanceOf(address(this)), 10000e18);
+ assertEq(barToken.totalSupply(), 20000e18);
+ deal(bar, address(this), 0, true);
+ assertEq(barToken.balanceOf(address(this)), 0);
+ assertEq(barToken.totalSupply(), 10000e18);
+ }
+
+ function test_DealERC1155Token() public {
+ BarERC1155 barToken = new BarERC1155();
+ address bar = address(barToken);
+ dealERC1155(bar, address(this), 0, 10000e18, false);
+ assertEq(barToken.balanceOf(address(this), 0), 10000e18);
+ }
+
+ function test_DealERC1155TokenAdjustTotalSupply() public {
+ BarERC1155 barToken = new BarERC1155();
+ address bar = address(barToken);
+ dealERC1155(bar, address(this), 0, 10000e18, true);
+ assertEq(barToken.balanceOf(address(this), 0), 10000e18);
+ assertEq(barToken.totalSupply(0), 20000e18);
+ dealERC1155(bar, address(this), 0, 0, true);
+ assertEq(barToken.balanceOf(address(this), 0), 0);
+ assertEq(barToken.totalSupply(0), 10000e18);
+ }
+
+ function test_DealERC721Token() public {
+ BarERC721 barToken = new BarERC721();
+ address bar = address(barToken);
+ dealERC721(bar, address(2), 1);
+ assertEq(barToken.balanceOf(address(2)), 1);
+ assertEq(barToken.balanceOf(address(1)), 0);
+ dealERC721(bar, address(1), 2);
+ assertEq(barToken.balanceOf(address(1)), 1);
+ assertEq(barToken.balanceOf(bar), 1);
+ }
+
+ function test_DeployCode() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""));
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ }
+
+ function test_DestroyAccount() public {
+ // deploy something to destroy it
+ BarERC721 barToken = new BarERC721();
+ address bar = address(barToken);
+ vm.setNonce(bar, 10);
+ deal(bar, 100);
+
+ uint256 prevThisBalance = address(this).balance;
+ uint256 size;
+ assembly {
+ size := extcodesize(bar)
+ }
+
+ assertGt(size, 0);
+ assertEq(bar.balance, 100);
+ assertEq(vm.getNonce(bar), 10);
+
+ destroyAccount(bar, address(this));
+ assembly {
+ size := extcodesize(bar)
+ }
+ assertEq(address(this).balance, prevThisBalance + 100);
+ assertEq(vm.getNonce(bar), 0);
+ assertEq(size, 0);
+ assertEq(bar.balance, 0);
+ }
+
+ function test_DeployCodeNoArgs() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar");
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ }
+
+ function test_DeployCodeVal() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether);
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ assertEq(deployed.balance, 1 ether);
+ }
+
+ function test_DeployCodeValNoArgs() public {
+ address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether);
+ assertEq(string(getCode(deployed)), string(getCode(address(test))));
+ assertEq(deployed.balance, 1 ether);
+ }
+
+ // We need this so we can call "this.deployCode" rather than "deployCode" directly
+ function deployCodeHelper(string memory what) external {
+ deployCode(what);
+ }
+
+ function test_RevertIf_DeployCodeFail() public {
+ vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed."));
+ this.deployCodeHelper("StdCheats.t.sol:RevertingContract");
+ }
+
+ function getCode(address who) internal view returns (bytes memory o_code) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // retrieve the size of the code, this needs assembly
+ let size := extcodesize(who)
+ // allocate output byte array - this could also be done without assembly
+ // by using o_code = new bytes(size)
+ o_code := mload(0x40)
+ // new "memory end" including padding
+ mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
+ // store length in memory
+ mstore(o_code, size)
+ // actually retrieve the code, this needs assembly
+ extcodecopy(who, add(o_code, 0x20), 0, size)
+ }
+ }
+
+ function test_DeriveRememberKey() public {
+ string memory mnemonic = "test test test test test test test test test test test junk";
+
+ (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0);
+ assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);
+ assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80);
+ }
+
+ function test_BytesToUint() public pure {
+ assertEq(3, bytesToUint_test(hex"03"));
+ assertEq(2, bytesToUint_test(hex"02"));
+ assertEq(255, bytesToUint_test(hex"ff"));
+ assertEq(29625, bytesToUint_test(hex"73b9"));
+ }
+
+ function test_ParseJsonTxDetail() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ string memory json = vm.readFile(path);
+ bytes memory transactionDetails = json.parseRaw(".transactions[0].tx");
+ RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail));
+ Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail);
+ assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);
+ assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512);
+ assertEq(
+ txDetail.data,
+ hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004"
+ );
+ assertEq(txDetail.nonce, 3);
+ assertEq(txDetail.txType, 2);
+ assertEq(txDetail.gas, 29625);
+ assertEq(txDetail.value, 0);
+ }
+
+ function test_ReadEIP1559Transaction() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ uint256 index = 0;
+ Tx1559 memory transaction = readTx1559(path, index);
+ transaction;
+ }
+
+ function test_ReadEIP1559Transactions() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ Tx1559[] memory transactions = readTx1559s(path);
+ transactions;
+ }
+
+ function test_ReadReceipt() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ uint256 index = 5;
+ Receipt memory receipt = readReceipt(path, index);
+ assertEq(
+ receipt.logsBloom,
+ hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"
+ );
+ }
+
+ function test_ReadReceipts() public view {
+ string memory root = vm.projectRoot();
+ string memory path = string.concat(root, "/test/fixtures/broadcast.log.json");
+ Receipt[] memory receipts = readReceipts(path);
+ receipts;
+ }
+
+ function test_GasMeteringModifier() public {
+ uint256 gas_start_normal = gasleft();
+ addInLoop();
+ uint256 gas_used_normal = gas_start_normal - gasleft();
+
+ uint256 gas_start_single = gasleft();
+ addInLoopNoGas();
+ uint256 gas_used_single = gas_start_single - gasleft();
+
+ uint256 gas_start_double = gasleft();
+ addInLoopNoGasNoGas();
+ uint256 gas_used_double = gas_start_double - gasleft();
+
+ assertTrue(gas_used_double + gas_used_single < gas_used_normal);
+ }
+
+ function addInLoop() internal pure returns (uint256) {
+ uint256 b;
+ for (uint256 i; i < 10000; i++) {
+ b += i;
+ }
+ return b;
+ }
+
+ function addInLoopNoGas() internal noGasMetering returns (uint256) {
+ return addInLoop();
+ }
+
+ function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) {
+ return addInLoopNoGas();
+ }
+
+ function bytesToUint_test(bytes memory b) private pure returns (uint256) {
+ uint256 number;
+ for (uint256 i = 0; i < b.length; i++) {
+ number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1))));
+ }
+ return number;
+ }
+
+ function testFuzz_AssumeAddressIsNot(address addr) external {
+ // skip over Payable and NonPayable enums
+ for (uint8 i = 2; i < uint8(type(AddressType).max); i++) {
+ assumeAddressIsNot(addr, AddressType(i));
+ }
+ assertTrue(addr != address(0));
+ assertTrue(addr < address(1) || addr > address(9));
+ assertTrue(addr != address(vm) || addr != 0x000000000000000000636F6e736F6c652e6c6f67);
+ }
+
+ function test_AssumePayable() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+
+ // all should revert since these addresses are not payable
+
+ // VM address
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+
+ // Console address
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumePayable(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ // Create2Deployer
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C);
+
+ // all should pass since these addresses are payable
+
+ // vitalik.eth
+ stdCheatsMock.exposed_assumePayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045);
+
+ // mock payable contract
+ MockContractPayable cp = new MockContractPayable();
+ stdCheatsMock.exposed_assumePayable(address(cp));
+ }
+
+ function test_AssumeNotPayable() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+
+ // all should pass since these addresses are not payable
+
+ // VM address
+ stdCheatsMock.exposed_assumeNotPayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
+
+ // Console address
+ stdCheatsMock.exposed_assumeNotPayable(0x000000000000000000636F6e736F6c652e6c6f67);
+
+ // Create2Deployer
+ stdCheatsMock.exposed_assumeNotPayable(0x4e59b44847b379578588920cA78FbF26c0B4956C);
+
+ // all should revert since these addresses are payable
+
+ // vitalik.eth
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumeNotPayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045);
+
+ // mock payable contract
+ MockContractPayable cp = new MockContractPayable();
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumeNotPayable(address(cp));
+ }
+
+ function testFuzz_AssumeNotPrecompile(address addr) external {
+ assumeNotPrecompile(addr, getChain("optimism_sepolia").chainId);
+ assertTrue(
+ addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000))
+ || addr > address(0x4200000000000000000000000000000000000800)
+ );
+ }
+
+ function testFuzz_AssumeNotForgeAddress(address addr) external pure {
+ assumeNotForgeAddress(addr);
+ assertTrue(
+ addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67
+ && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C
+ );
+ }
+
+ function test_RevertIf_CannotDeployCodeTo() external {
+ vm.expectRevert("StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode.");
+ this._revertDeployCodeTo();
+ }
+
+ function _revertDeployCodeTo() external {
+ deployCodeTo("StdCheats.t.sol:RevertingContract", address(0));
+ }
+
+ function test_DeployCodeTo() external {
+ address arbitraryAddress = makeAddr("arbitraryAddress");
+
+ deployCodeTo(
+ "StdCheats.t.sol:MockContractWithConstructorArgs",
+ abi.encode(uint256(6), true, bytes20(arbitraryAddress)),
+ 1 ether,
+ arbitraryAddress
+ );
+
+ MockContractWithConstructorArgs ct = MockContractWithConstructorArgs(arbitraryAddress);
+
+ assertEq(arbitraryAddress.balance, 1 ether);
+ assertEq(ct.x(), 6);
+ assertTrue(ct.y());
+ assertEq(ct.z(), bytes20(arbitraryAddress));
+ }
+}
+
+contract StdCheatsMock is StdCheats {
+ function exposed_assumePayable(address addr) external {
+ assumePayable(addr);
+ }
+
+ function exposed_assumeNotPayable(address addr) external {
+ assumeNotPayable(addr);
+ }
+
+ // We deploy a mock version so we can properly test expected reverts.
+ function exposed_assumeNotBlacklisted(address token, address addr) external view {
+ return assumeNotBlacklisted(token, addr);
+ }
+}
+
+contract StdCheatsForkTest is Test {
+ address internal constant SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
+ address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD;
+ address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
+ address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A;
+
+ function setUp() public {
+ // All tests of the `assumeNotBlacklisted` method are fork tests using live contracts.
+ vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900});
+ }
+
+ function test_RevertIf_CannotAssumeNoBlacklisted_EOA() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ address eoa = vm.addr({privateKey: 1});
+ vm.expectRevert("StdCheats assumeNotBlacklisted(address,address): Token address is not a contract.");
+ stdCheatsMock.exposed_assumeNotBlacklisted(eoa, address(0));
+ }
+
+ function testFuzz_AssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external view {
+ assumeNotBlacklisted(SHIB, addr);
+ assertTrue(true);
+ }
+
+ function test_RevertIf_AssumeNoBlacklisted_USDC() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumeNotBlacklisted(USDC, USDC_BLACKLISTED_USER);
+ }
+
+ function testFuzz_AssumeNotBlacklisted_USDC(address addr) external view {
+ assumeNotBlacklisted(USDC, addr);
+ assertFalse(USDCLike(USDC).isBlacklisted(addr));
+ }
+
+ function test_RevertIf_AssumeNoBlacklisted_USDT() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdCheatsMock stdCheatsMock = new StdCheatsMock();
+ vm.expectRevert();
+ stdCheatsMock.exposed_assumeNotBlacklisted(USDT, USDT_BLACKLISTED_USER);
+ }
+
+ function testFuzz_AssumeNotBlacklisted_USDT(address addr) external view {
+ assumeNotBlacklisted(USDT, addr);
+ assertFalse(USDTLike(USDT).isBlackListed(addr));
+ }
+
+ function test_dealUSDC() external {
+ // roll fork to the point when USDC contract updated to store balance in packed slots
+ vm.rollFork(19279215);
+
+ uint256 balance = 100e6;
+ deal(USDC, address(this), balance);
+ assertEq(IERC20(USDC).balanceOf(address(this)), balance);
+ }
+}
+
+contract Bar {
+ constructor() payable {
+ /// `DEAL` STDCHEAT
+ totalSupply = 10000e18;
+ balanceOf[address(this)] = totalSupply;
+ }
+
+ /// `HOAX` and `CHANGEPRANK` STDCHEATS
+ function bar(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ }
+
+ function origin(address expectedSender) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ require(tx.origin == expectedSender, "!prank");
+ }
+
+ function origin(address expectedSender, address expectedOrigin) public payable {
+ require(msg.sender == expectedSender, "!prank");
+ require(tx.origin == expectedOrigin, "!prank");
+ }
+
+ /// `DEAL` STDCHEAT
+ mapping(address => uint256) public balanceOf;
+ uint256 public totalSupply;
+}
+
+contract BarERC1155 {
+ constructor() payable {
+ /// `DEALERC1155` STDCHEAT
+ _totalSupply[0] = 10000e18;
+ _balances[0][address(this)] = _totalSupply[0];
+ }
+
+ function balanceOf(address account, uint256 id) public view virtual returns (uint256) {
+ return _balances[id][account];
+ }
+
+ function totalSupply(uint256 id) public view virtual returns (uint256) {
+ return _totalSupply[id];
+ }
+
+ /// `DEALERC1155` STDCHEAT
+ mapping(uint256 => mapping(address => uint256)) private _balances;
+ mapping(uint256 => uint256) private _totalSupply;
+}
+
+contract BarERC721 {
+ constructor() payable {
+ /// `DEALERC721` STDCHEAT
+ _owners[1] = address(1);
+ _balances[address(1)] = 1;
+ _owners[2] = address(this);
+ _owners[3] = address(this);
+ _balances[address(this)] = 2;
+ }
+
+ function balanceOf(address owner) public view virtual returns (uint256) {
+ return _balances[owner];
+ }
+
+ function ownerOf(uint256 tokenId) public view virtual returns (address) {
+ address owner = _owners[tokenId];
+ return owner;
+ }
+
+ mapping(uint256 => address) private _owners;
+ mapping(address => uint256) private _balances;
+}
+
+interface USDCLike {
+ function isBlacklisted(address) external view returns (bool);
+}
+
+interface USDTLike {
+ function isBlackListed(address) external view returns (bool);
+}
+
+contract RevertingContract {
+ constructor() {
+ revert();
+ }
+}
+
+contract MockContractWithConstructorArgs {
+ uint256 public immutable x;
+ bool public y;
+ bytes20 public z;
+
+ constructor(uint256 _x, bool _y, bytes20 _z) payable {
+ x = _x;
+ y = _y;
+ z = _z;
+ }
+}
+
+contract MockContractPayable {
+ receive() external payable {}
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdError.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdError.t.sol
new file mode 100644
index 000000000..29803d5d5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdError.t.sol
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.8.0 <0.9.0;
+
+import {stdError} from "../src/StdError.sol";
+import {Test} from "../src/Test.sol";
+
+contract StdErrorsTest is Test {
+ ErrorsTest test;
+
+ function setUp() public {
+ test = new ErrorsTest();
+ }
+
+ function test_RevertIf_AssertionError() public {
+ vm.expectRevert(stdError.assertionError);
+ test.assertionError();
+ }
+
+ function test_RevertIf_ArithmeticError() public {
+ vm.expectRevert(stdError.arithmeticError);
+ test.arithmeticError(10);
+ }
+
+ function test_RevertIf_DivisionError() public {
+ vm.expectRevert(stdError.divisionError);
+ test.divError(0);
+ }
+
+ function test_RevertIf_ModError() public {
+ vm.expectRevert(stdError.divisionError);
+ test.modError(0);
+ }
+
+ function test_RevertIf_EnumConversionError() public {
+ vm.expectRevert(stdError.enumConversionError);
+ test.enumConversion(1);
+ }
+
+ function test_RevertIf_EncodeStgError() public {
+ vm.expectRevert(stdError.encodeStorageError);
+ test.encodeStgError();
+ }
+
+ function test_RevertIf_PopError() public {
+ vm.expectRevert(stdError.popError);
+ test.pop();
+ }
+
+ function test_RevertIf_IndexOOBError() public {
+ vm.expectRevert(stdError.indexOOBError);
+ test.indexOOBError(1);
+ }
+
+ function test_RevertIf_MemOverflowError() public {
+ vm.expectRevert(stdError.memOverflowError);
+ test.mem();
+ }
+
+ function test_RevertIf_InternError() public {
+ vm.expectRevert(stdError.zeroVarError);
+ test.intern();
+ }
+}
+
+contract ErrorsTest {
+ enum T {
+ T1
+ }
+
+ uint256[] public someArr;
+ bytes someBytes;
+
+ function assertionError() public pure {
+ assert(false);
+ }
+
+ function arithmeticError(uint256 a) public pure {
+ a -= 100;
+ }
+
+ function divError(uint256 a) public pure {
+ 100 / a;
+ }
+
+ function modError(uint256 a) public pure {
+ 100 % a;
+ }
+
+ function enumConversion(uint256 a) public pure {
+ T(a);
+ }
+
+ function encodeStgError() public {
+ /// @solidity memory-safe-assembly
+ assembly {
+ sstore(someBytes.slot, 1)
+ }
+ keccak256(someBytes);
+ }
+
+ function pop() public {
+ someArr.pop();
+ }
+
+ function indexOOBError(uint256 a) public pure {
+ uint256[] memory t = new uint256[](0);
+ t[a];
+ }
+
+ function mem() public pure {
+ uint256 l = 2 ** 256 / 32;
+ new uint256[](l);
+ }
+
+ function intern() public returns (uint256) {
+ function(uint256) internal returns (uint256) x;
+ x(2);
+ return 7;
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdJson.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdJson.t.sol
new file mode 100644
index 000000000..6bedfcc9a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdJson.t.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test, stdJson} from "../src/Test.sol";
+
+contract StdJsonTest is Test {
+ using stdJson for string;
+
+ string root;
+ string path;
+
+ function setUp() public {
+ root = vm.projectRoot();
+ path = string.concat(root, "/test/fixtures/test.json");
+ }
+
+ struct SimpleJson {
+ uint256 a;
+ string b;
+ }
+
+ struct NestedJson {
+ uint256 a;
+ string b;
+ SimpleJson c;
+ }
+
+ function test_readJson() public view {
+ string memory json = vm.readFile(path);
+ assertEq(json.readUint(".a"), 123);
+ }
+
+ function test_writeJson() public {
+ string memory json = "json";
+ json.serialize("a", uint256(123));
+ string memory semiFinal = json.serialize("b", string("test"));
+ string memory finalJson = json.serialize("c", semiFinal);
+ finalJson.write(path);
+
+ string memory json_ = vm.readFile(path);
+ bytes memory data = json_.parseRaw("$");
+ NestedJson memory decodedData = abi.decode(data, (NestedJson));
+
+ assertEq(decodedData.a, 123);
+ assertEq(decodedData.b, "test");
+ assertEq(decodedData.c.a, 123);
+ assertEq(decodedData.c.b, "test");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdMath.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdMath.t.sol
new file mode 100644
index 000000000..d1269a02a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdMath.t.sol
@@ -0,0 +1,202 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.8.0 <0.9.0;
+
+import {stdMath} from "../src/StdMath.sol";
+import {Test, stdError} from "../src/Test.sol";
+
+contract StdMathMock is Test {
+ function exposed_percentDelta(uint256 a, uint256 b) public pure returns (uint256) {
+ return stdMath.percentDelta(a, b);
+ }
+
+ function exposed_percentDelta(int256 a, int256 b) public pure returns (uint256) {
+ return stdMath.percentDelta(a, b);
+ }
+}
+
+contract StdMathTest is Test {
+ function test_GetAbs() external pure {
+ assertEq(stdMath.abs(-50), 50);
+ assertEq(stdMath.abs(50), 50);
+ assertEq(stdMath.abs(-1337), 1337);
+ assertEq(stdMath.abs(0), 0);
+
+ assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1);
+ assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1));
+ }
+
+ function testFuzz_GetAbs(int256 a) external pure {
+ uint256 manualAbs = getAbs(a);
+
+ uint256 abs = stdMath.abs(a);
+
+ assertEq(abs, manualAbs);
+ }
+
+ function test_GetDelta_Uint() external pure {
+ assertEq(stdMath.delta(uint256(0), uint256(0)), 0);
+ assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337);
+ assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max);
+ assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max);
+ assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max);
+
+ assertEq(stdMath.delta(0, uint256(0)), 0);
+ assertEq(stdMath.delta(1337, uint256(0)), 1337);
+ assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max);
+ assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max);
+ assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max);
+
+ assertEq(stdMath.delta(1337, uint256(1337)), 0);
+ assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0);
+ assertEq(stdMath.delta(5000, uint256(1250)), 3750);
+ }
+
+ function testFuzz_GetDelta_Uint(uint256 a, uint256 b) external pure {
+ uint256 manualDelta = a > b ? a - b : b - a;
+
+ uint256 delta = stdMath.delta(a, b);
+
+ assertEq(delta, manualDelta);
+ }
+
+ function test_GetDelta_Int() external pure {
+ assertEq(stdMath.delta(int256(0), int256(0)), 0);
+ assertEq(stdMath.delta(int256(0), int256(1337)), 1337);
+ assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1);
+ assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1);
+ assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1);
+
+ assertEq(stdMath.delta(0, int256(0)), 0);
+ assertEq(stdMath.delta(1337, int256(0)), 1337);
+ assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1);
+ assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1);
+ assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1);
+
+ assertEq(stdMath.delta(-0, int256(0)), 0);
+ assertEq(stdMath.delta(-1337, int256(0)), 1337);
+ assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1);
+ assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1);
+ assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1);
+
+ assertEq(stdMath.delta(int256(0), -0), 0);
+ assertEq(stdMath.delta(int256(0), -1337), 1337);
+ assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1);
+ assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1);
+ assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1);
+
+ assertEq(stdMath.delta(1337, int256(1337)), 0);
+ assertEq(stdMath.delta(type(int256).max, type(int256).max), 0);
+ assertEq(stdMath.delta(type(int256).min, type(int256).min), 0);
+ assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max);
+ assertEq(stdMath.delta(5000, int256(1250)), 3750);
+ }
+
+ function testFuzz_GetDelta_Int(int256 a, int256 b) external pure {
+ uint256 absA = getAbs(a);
+ uint256 absB = getAbs(b);
+ uint256 absDelta = absA > absB ? absA - absB : absB - absA;
+
+ uint256 manualDelta;
+ if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) {
+ manualDelta = absDelta;
+ }
+ // (a < 0 && b >= 0) || (a >= 0 && b < 0)
+ else {
+ manualDelta = absA + absB;
+ }
+
+ uint256 delta = stdMath.delta(a, b);
+
+ assertEq(delta, manualDelta);
+ }
+
+ function test_GetPercentDelta_Uint() external {
+ StdMathMock stdMathMock = new StdMathMock();
+
+ assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18);
+ assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18);
+
+ assertEq(stdMath.percentDelta(1337, uint256(1337)), 0);
+ assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0);
+ assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(2500, uint256(2500)), 0);
+ assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18);
+
+ vm.expectRevert(stdError.divisionError);
+ stdMathMock.exposed_percentDelta(uint256(1), 0);
+ }
+
+ function testFuzz_GetPercentDelta_Uint(uint192 a, uint192 b) external pure {
+ vm.assume(b != 0);
+ uint256 manualDelta = a > b ? a - b : b - a;
+
+ uint256 manualPercentDelta = manualDelta * 1e18 / b;
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ assertEq(percentDelta, manualPercentDelta);
+ }
+
+ function test_GetPercentDelta_Int() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdMathMock stdMathMock = new StdMathMock();
+
+ assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), -1337), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18);
+ assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18);
+
+ assertEq(stdMath.percentDelta(1337, int256(1337)), 0);
+ assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0);
+ assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0);
+
+ assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down
+ assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down
+ assertEq(stdMath.percentDelta(0, int256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(2500, int256(2500)), 0);
+ assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18);
+ assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18);
+
+ vm.expectRevert(stdError.divisionError);
+ stdMathMock.exposed_percentDelta(int256(1), 0);
+ }
+
+ function testFuzz_GetPercentDelta_Int(int192 a, int192 b) external pure {
+ vm.assume(b != 0);
+ uint256 absA = getAbs(a);
+ uint256 absB = getAbs(b);
+ uint256 absDelta = absA > absB ? absA - absB : absB - absA;
+
+ uint256 manualDelta;
+ if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) {
+ manualDelta = absDelta;
+ }
+ // (a < 0 && b >= 0) || (a >= 0 && b < 0)
+ else {
+ manualDelta = absA + absB;
+ }
+
+ uint256 manualPercentDelta = manualDelta * 1e18 / absB;
+ uint256 percentDelta = stdMath.percentDelta(a, b);
+
+ assertEq(percentDelta, manualPercentDelta);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ HELPERS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function getAbs(int256 a) private pure returns (uint256) {
+ if (a < 0) {
+ return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a);
+ }
+
+ return uint256(a);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdStorage.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdStorage.t.sol
new file mode 100644
index 000000000..fd79abaae
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdStorage.t.sol
@@ -0,0 +1,471 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {stdStorage, StdStorage} from "../src/StdStorage.sol";
+import {Test} from "../src/Test.sol";
+
+contract StdStorageTest is Test {
+ using stdStorage for StdStorage;
+
+ StorageTest internal test;
+
+ function setUp() public {
+ test = new StorageTest();
+ }
+
+ function test_StorageHidden() public {
+ assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find());
+ }
+
+ function test_StorageObvious() public {
+ assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find());
+ }
+
+ function test_StorageExtraSload() public {
+ assertEq(16, stdstore.target(address(test)).sig(test.extra_sload.selector).find());
+ }
+
+ function test_StorageCheckedWriteHidden() public {
+ stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100);
+ assertEq(uint256(test.hidden()), 100);
+ }
+
+ function test_StorageCheckedWriteObvious() public {
+ stdstore.target(address(test)).sig(test.exists.selector).checked_write(100);
+ assertEq(test.exists(), 100);
+ }
+
+ function test_StorageCheckedWriteSignedIntegerHidden() public {
+ stdstore.target(address(test)).sig(test.hidden.selector).checked_write_int(-100);
+ assertEq(int256(uint256(test.hidden())), -100);
+ }
+
+ function test_StorageCheckedWriteSignedIntegerObvious() public {
+ stdstore.target(address(test)).sig(test.tG.selector).checked_write_int(-100);
+ assertEq(test.tG(), -100);
+ }
+
+ function test_StorageMapStructA() public {
+ uint256 slot =
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot);
+ }
+
+ function test_StorageMapStructB() public {
+ uint256 slot =
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot);
+ }
+
+ function test_StorageDeepMap() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(
+ address(this)
+ ).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot);
+ }
+
+ function test_StorageCheckedWriteDeepMap() public {
+ stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this))
+ .checked_write(100);
+ assertEq(100, test.deep_map(address(this), address(this)));
+ }
+
+ function test_StorageDeepMapStructA() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(0).find();
+ assertEq(
+ bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0),
+ bytes32(slot)
+ );
+ }
+
+ function test_StorageDeepMapStructB() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this))
+ .with_key(address(this)).depth(1).find();
+ assertEq(
+ bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1),
+ bytes32(slot)
+ );
+ }
+
+ function test_StorageCheckedWriteDeepMapStructA() public {
+ stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key(
+ address(this)
+ ).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this));
+ assertEq(100, a);
+ assertEq(0, b);
+ }
+
+ function test_StorageCheckedWriteDeepMapStructB() public {
+ stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key(
+ address(this)
+ ).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this));
+ assertEq(0, a);
+ assertEq(100, b);
+ }
+
+ function test_StorageCheckedWriteMapStructA() public {
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.map_struct(address(this));
+ assertEq(a, 100);
+ assertEq(b, 0);
+ }
+
+ function test_StorageCheckedWriteMapStructB() public {
+ stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.map_struct(address(this));
+ assertEq(a, 0);
+ assertEq(b, 100);
+ }
+
+ function test_StorageStructA() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find();
+ assertEq(uint256(7), slot);
+ }
+
+ function test_StorageStructB() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find();
+ assertEq(uint256(7) + 1, slot);
+ }
+
+ function test_StorageCheckedWriteStructA() public {
+ stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100);
+ (uint256 a, uint256 b) = test.basic();
+ assertEq(a, 100);
+ assertEq(b, 1337);
+ }
+
+ function test_StorageCheckedWriteStructB() public {
+ stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100);
+ (uint256 a, uint256 b) = test.basic();
+ assertEq(a, 1337);
+ assertEq(b, 100);
+ }
+
+ function test_StorageMapAddrFound() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find();
+ assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot);
+ }
+
+ function test_StorageMapAddrRoot() public {
+ (uint256 slot, bytes32 key) =
+ stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).parent();
+ assertEq(address(uint160(uint256(key))), address(this));
+ assertEq(uint256(1), slot);
+ slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).root();
+ assertEq(uint256(1), slot);
+ }
+
+ function test_StorageMapUintFound() public {
+ uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find();
+ assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot);
+ }
+
+ function test_StorageCheckedWriteMapUint() public {
+ stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100);
+ assertEq(100, test.map_uint(100));
+ }
+
+ function test_StorageCheckedWriteMapAddr() public {
+ stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100);
+ assertEq(100, test.map_addr(address(this)));
+ }
+
+ function test_StorageCheckedWriteMapBool() public {
+ stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true);
+ assertTrue(test.map_bool(address(this)));
+ }
+
+ function testFuzz_StorageCheckedWriteMapPacked(address addr, uint128 value) public {
+ stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_lower.selector).with_key(addr)
+ .checked_write(value);
+ assertEq(test.read_struct_lower(addr), value);
+
+ stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_upper.selector).with_key(addr)
+ .checked_write(value);
+ assertEq(test.read_struct_upper(addr), value);
+ }
+
+ function test_StorageCheckedWriteMapPackedFullSuccess() public {
+ uint256 full = test.map_packed(address(1337));
+ // keep upper 128, set lower 128 to 1337
+ full = (full & (uint256((1 << 128) - 1) << 128)) | 1337;
+ stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write(
+ full
+ );
+ assertEq(1337, test.read_struct_lower(address(1337)));
+ }
+
+ function testFail_StorageConst() public {
+ // vm.expectRevert(abi.encodeWithSignature("NotStorage(bytes4)", bytes4(keccak256("const()"))));
+ stdstore.target(address(test)).sig("const()").find();
+ }
+
+ function testFuzz_StorageNativePack(uint248 val1, uint248 val2, bool boolVal1, bool boolVal2) public {
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tA.selector).checked_write(val1);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tB.selector).checked_write(boolVal1);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tC.selector).checked_write(boolVal2);
+ stdstore.enable_packed_slots().target(address(test)).sig(test.tD.selector).checked_write(val2);
+
+ assertEq(test.tA(), val1);
+ assertEq(test.tB(), boolVal1);
+ assertEq(test.tC(), boolVal2);
+ assertEq(test.tD(), val2);
+ }
+
+ function test_StorageReadBytes32() public {
+ bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32();
+ assertEq(val, hex"1337");
+ }
+
+ function test_StorageReadBool_False() public {
+ bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool();
+ assertEq(val, false);
+ }
+
+ function test_StorageReadBool_True() public {
+ bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool();
+ assertEq(val, true);
+ }
+
+ function test_RevertIf_ReadingNonBoolValue() public {
+ vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool.");
+ this.readNonBoolValue();
+ }
+
+ function readNonBoolValue() public {
+ stdstore.target(address(test)).sig(test.tE.selector).read_bool();
+ }
+
+ function test_StorageReadAddress() public {
+ address val = stdstore.target(address(test)).sig(test.tF.selector).read_address();
+ assertEq(val, address(1337));
+ }
+
+ function test_StorageReadUint() public {
+ uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint();
+ assertEq(val, 1);
+ }
+
+ function test_StorageReadInt() public {
+ int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int();
+ assertEq(val, type(int256).min);
+ }
+
+ function testFuzz_Packed(uint256 val, uint8 elemToGet) public {
+ // This function tries an assortment of packed slots, shifts meaning number of elements
+ // that are packed. Shiftsizes are the size of each element, i.e. 8 means a data type that is 8 bits, 16 == 16 bits, etc.
+ // Combined, these determine how a slot is packed. Making it random is too hard to avoid global rejection limit
+ // and make it performant.
+
+ // change the number of shifts
+ for (uint256 i = 1; i < 5; i++) {
+ uint256 shifts = i;
+
+ elemToGet = uint8(bound(elemToGet, 0, shifts - 1));
+
+ uint256[] memory shiftSizes = new uint256[](shifts);
+ for (uint256 j; j < shifts; j++) {
+ shiftSizes[j] = 8 * (j + 1);
+ }
+
+ test.setRandomPacking(val);
+
+ uint256 leftBits;
+ uint256 rightBits;
+ for (uint256 j; j < shiftSizes.length; j++) {
+ if (j < elemToGet) {
+ leftBits += shiftSizes[j];
+ } else if (elemToGet != j) {
+ rightBits += shiftSizes[j];
+ }
+ }
+
+ // we may have some right bits unaccounted for
+ leftBits += 256 - (leftBits + shiftSizes[elemToGet] + rightBits);
+ // clear left bits, then clear right bits and realign
+ uint256 expectedValToRead = (val << leftBits) >> (leftBits + rightBits);
+
+ uint256 readVal = stdstore.target(address(test)).enable_packed_slots().sig(
+ "getRandomPacked(uint8,uint8[],uint8)"
+ ).with_calldata(abi.encode(shifts, shiftSizes, elemToGet)).read_uint();
+
+ assertEq(readVal, expectedValToRead);
+ }
+ }
+
+ function testFuzz_Packed2(uint256 nvars, uint256 seed) public {
+ // Number of random variables to generate.
+ nvars = bound(nvars, 1, 20);
+
+ // This will decrease as we generate values in the below loop.
+ uint256 bitsRemaining = 256;
+
+ // Generate a random value and size for each variable.
+ uint256[] memory vals = new uint256[](nvars);
+ uint256[] memory sizes = new uint256[](nvars);
+ uint256[] memory offsets = new uint256[](nvars);
+
+ for (uint256 i = 0; i < nvars; i++) {
+ // Generate a random value and size.
+ offsets[i] = i == 0 ? 0 : offsets[i - 1] + sizes[i - 1];
+
+ uint256 nvarsRemaining = nvars - i;
+ uint256 maxVarSize = bitsRemaining - nvarsRemaining + 1;
+ sizes[i] = bound(uint256(keccak256(abi.encodePacked(seed, i + 256))), 1, maxVarSize);
+ bitsRemaining -= sizes[i];
+
+ uint256 maxVal;
+ uint256 varSize = sizes[i];
+ assembly {
+ // mask = (1 << varSize) - 1
+ maxVal := sub(shl(varSize, 1), 1)
+ }
+ vals[i] = bound(uint256(keccak256(abi.encodePacked(seed, i))), 0, maxVal);
+ }
+
+ // Pack all values into the slot.
+ for (uint256 i = 0; i < nvars; i++) {
+ stdstore.enable_packed_slots().target(address(test)).sig("getRandomPacked(uint256,uint256)").with_key(
+ sizes[i]
+ ).with_key(offsets[i]).checked_write(vals[i]);
+ }
+
+ // Verify the read data matches.
+ for (uint256 i = 0; i < nvars; i++) {
+ uint256 readVal = stdstore.enable_packed_slots().target(address(test)).sig(
+ "getRandomPacked(uint256,uint256)"
+ ).with_key(sizes[i]).with_key(offsets[i]).read_uint();
+
+ uint256 retVal = test.getRandomPacked(sizes[i], offsets[i]);
+
+ assertEq(readVal, vals[i]);
+ assertEq(retVal, vals[i]);
+ }
+ }
+
+ function testEdgeCaseArray() public {
+ stdstore.target(address(test)).sig("edgeCaseArray(uint256)").with_key(uint256(0)).checked_write(1);
+ assertEq(test.edgeCaseArray(0), 1);
+ }
+}
+
+contract StorageTest {
+ uint256 public exists = 1;
+ mapping(address => uint256) public map_addr;
+ mapping(uint256 => uint256) public map_uint;
+ mapping(address => uint256) public map_packed;
+ mapping(address => UnpackedStruct) public map_struct;
+ mapping(address => mapping(address => uint256)) public deep_map;
+ mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct;
+ UnpackedStruct public basic;
+
+ uint248 public tA;
+ bool public tB;
+
+ bool public tC = false;
+ uint248 public tD = 1;
+
+ struct UnpackedStruct {
+ uint256 a;
+ uint256 b;
+ }
+
+ mapping(address => bool) public map_bool;
+
+ bytes32 public tE = hex"1337";
+ address public tF = address(1337);
+ int256 public tG = type(int256).min;
+ bool public tH = true;
+ bytes32 private tI = ~bytes32(hex"1337");
+
+ uint256 randomPacking;
+
+ // Array with length matching values of elements.
+ uint256[] public edgeCaseArray = [3, 3, 3];
+
+ constructor() {
+ basic = UnpackedStruct({a: 1337, b: 1337});
+
+ uint256 two = (1 << 128) | 1;
+ map_packed[msg.sender] = two;
+ map_packed[address(uint160(1337))] = 1 << 128;
+ }
+
+ function read_struct_upper(address who) public view returns (uint256) {
+ return map_packed[who] >> 128;
+ }
+
+ function read_struct_lower(address who) public view returns (uint256) {
+ return map_packed[who] & ((1 << 128) - 1);
+ }
+
+ function hidden() public view returns (bytes32 t) {
+ bytes32 slot = keccak256("my.random.var");
+ /// @solidity memory-safe-assembly
+ assembly {
+ t := sload(slot)
+ }
+ }
+
+ function const() public pure returns (bytes32 t) {
+ t = bytes32(hex"1337");
+ }
+
+ function extra_sload() public view returns (bytes32 t) {
+ // trigger read on slot `tE`, and make a staticcall to make sure compiler doesn't optimize this SLOAD away
+ assembly {
+ pop(staticcall(gas(), sload(tE.slot), 0, 0, 0, 0))
+ }
+ t = tI;
+ }
+
+ function setRandomPacking(uint256 val) public {
+ randomPacking = val;
+ }
+
+ function _getMask(uint256 size) internal pure returns (uint256 mask) {
+ assembly {
+ // mask = (1 << size) - 1
+ mask := sub(shl(size, 1), 1)
+ }
+ }
+
+ function setRandomPacking(uint256 val, uint256 size, uint256 offset) public {
+ // Generate mask based on the size of the value
+ uint256 mask = _getMask(size);
+ // Zero out all bits for the word we're about to set
+ uint256 cleanedWord = randomPacking & ~(mask << offset);
+ // Place val in the correct spot of the cleaned word
+ randomPacking = cleanedWord | val << offset;
+ }
+
+ function getRandomPacked(uint256 size, uint256 offset) public view returns (uint256) {
+ // Generate mask based on the size of the value
+ uint256 mask = _getMask(size);
+ // Shift to place the bits in the correct position, and use mask to zero out remaining bits
+ return (randomPacking >> offset) & mask;
+ }
+
+ function getRandomPacked(uint8 shifts, uint8[] memory shiftSizes, uint8 elem) public view returns (uint256) {
+ require(elem < shifts, "!elem");
+ uint256 leftBits;
+ uint256 rightBits;
+
+ for (uint256 i; i < shiftSizes.length; i++) {
+ if (i < elem) {
+ leftBits += shiftSizes[i];
+ } else if (elem != i) {
+ rightBits += shiftSizes[i];
+ }
+ }
+
+ // we may have some right bits unaccounted for
+ leftBits += 256 - (leftBits + shiftSizes[elem] + rightBits);
+
+ // clear left bits, then clear right bits and realign
+ return (randomPacking << leftBits) >> (leftBits + rightBits);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdStyle.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdStyle.t.sol
new file mode 100644
index 000000000..974e756fe
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdStyle.t.sol
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test, console2, StdStyle} from "../src/Test.sol";
+
+contract StdStyleTest is Test {
+ function test_StyleColor() public pure {
+ console2.log(StdStyle.red("StdStyle.red String Test"));
+ console2.log(StdStyle.red(uint256(10e18)));
+ console2.log(StdStyle.red(int256(-10e18)));
+ console2.log(StdStyle.red(true));
+ console2.log(StdStyle.red(address(0)));
+ console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.redBytes32("StdStyle.redBytes32"));
+ console2.log(StdStyle.green("StdStyle.green String Test"));
+ console2.log(StdStyle.green(uint256(10e18)));
+ console2.log(StdStyle.green(int256(-10e18)));
+ console2.log(StdStyle.green(true));
+ console2.log(StdStyle.green(address(0)));
+ console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32"));
+ console2.log(StdStyle.yellow("StdStyle.yellow String Test"));
+ console2.log(StdStyle.yellow(uint256(10e18)));
+ console2.log(StdStyle.yellow(int256(-10e18)));
+ console2.log(StdStyle.yellow(true));
+ console2.log(StdStyle.yellow(address(0)));
+ console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32"));
+ console2.log(StdStyle.blue("StdStyle.blue String Test"));
+ console2.log(StdStyle.blue(uint256(10e18)));
+ console2.log(StdStyle.blue(int256(-10e18)));
+ console2.log(StdStyle.blue(true));
+ console2.log(StdStyle.blue(address(0)));
+ console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32"));
+ console2.log(StdStyle.magenta("StdStyle.magenta String Test"));
+ console2.log(StdStyle.magenta(uint256(10e18)));
+ console2.log(StdStyle.magenta(int256(-10e18)));
+ console2.log(StdStyle.magenta(true));
+ console2.log(StdStyle.magenta(address(0)));
+ console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32"));
+ console2.log(StdStyle.cyan("StdStyle.cyan String Test"));
+ console2.log(StdStyle.cyan(uint256(10e18)));
+ console2.log(StdStyle.cyan(int256(-10e18)));
+ console2.log(StdStyle.cyan(true));
+ console2.log(StdStyle.cyan(address(0)));
+ console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32"));
+ }
+
+ function test_StyleFontWeight() public pure {
+ console2.log(StdStyle.bold("StdStyle.bold String Test"));
+ console2.log(StdStyle.bold(uint256(10e18)));
+ console2.log(StdStyle.bold(int256(-10e18)));
+ console2.log(StdStyle.bold(address(0)));
+ console2.log(StdStyle.bold(true));
+ console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32"));
+ console2.log(StdStyle.dim("StdStyle.dim String Test"));
+ console2.log(StdStyle.dim(uint256(10e18)));
+ console2.log(StdStyle.dim(int256(-10e18)));
+ console2.log(StdStyle.dim(address(0)));
+ console2.log(StdStyle.dim(true));
+ console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32"));
+ console2.log(StdStyle.italic("StdStyle.italic String Test"));
+ console2.log(StdStyle.italic(uint256(10e18)));
+ console2.log(StdStyle.italic(int256(-10e18)));
+ console2.log(StdStyle.italic(address(0)));
+ console2.log(StdStyle.italic(true));
+ console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32"));
+ console2.log(StdStyle.underline("StdStyle.underline String Test"));
+ console2.log(StdStyle.underline(uint256(10e18)));
+ console2.log(StdStyle.underline(int256(-10e18)));
+ console2.log(StdStyle.underline(address(0)));
+ console2.log(StdStyle.underline(true));
+ console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32"));
+ console2.log(StdStyle.inverse("StdStyle.inverse String Test"));
+ console2.log(StdStyle.inverse(uint256(10e18)));
+ console2.log(StdStyle.inverse(int256(-10e18)));
+ console2.log(StdStyle.inverse(address(0)));
+ console2.log(StdStyle.inverse(true));
+ console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D"));
+ console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32"));
+ }
+
+ function test_StyleCombined() public pure {
+ console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test")));
+ console2.log(StdStyle.green(StdStyle.dim(uint256(10e18))));
+ console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18))));
+ console2.log(StdStyle.blue(StdStyle.underline(address(0))));
+ console2.log(StdStyle.magenta(StdStyle.inverse(true)));
+ }
+
+ function test_StyleCustom() public pure {
+ console2.log(h1("Custom Style 1"));
+ console2.log(h2("Custom Style 2"));
+ }
+
+ function h1(string memory a) private pure returns (string memory) {
+ return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a)));
+ }
+
+ function h2(string memory a) private pure returns (string memory) {
+ return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a)));
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdToml.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdToml.t.sol
new file mode 100644
index 000000000..5a45f4f5c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdToml.t.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test, stdToml} from "../src/Test.sol";
+
+contract StdTomlTest is Test {
+ using stdToml for string;
+
+ string root;
+ string path;
+
+ function setUp() public {
+ root = vm.projectRoot();
+ path = string.concat(root, "/test/fixtures/test.toml");
+ }
+
+ struct SimpleToml {
+ uint256 a;
+ string b;
+ }
+
+ struct NestedToml {
+ uint256 a;
+ string b;
+ SimpleToml c;
+ }
+
+ function test_readToml() public view {
+ string memory json = vm.readFile(path);
+ assertEq(json.readUint(".a"), 123);
+ }
+
+ function test_writeToml() public {
+ string memory json = "json";
+ json.serialize("a", uint256(123));
+ string memory semiFinal = json.serialize("b", string("test"));
+ string memory finalJson = json.serialize("c", semiFinal);
+ finalJson.write(path);
+
+ string memory toml = vm.readFile(path);
+ bytes memory data = toml.parseRaw("$");
+ NestedToml memory decodedData = abi.decode(data, (NestedToml));
+
+ assertEq(decodedData.a, 123);
+ assertEq(decodedData.b, "test");
+ assertEq(decodedData.c.a, 123);
+ assertEq(decodedData.c.b, "test");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdUtils.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdUtils.t.sol
new file mode 100644
index 000000000..aee801b2c
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdUtils.t.sol
@@ -0,0 +1,342 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {Test, StdUtils} from "../src/Test.sol";
+
+contract StdUtilsMock is StdUtils {
+ // We deploy a mock version so we can properly test expected reverts.
+ function exposed_getTokenBalances(address token, address[] memory addresses)
+ external
+ returns (uint256[] memory balances)
+ {
+ return getTokenBalances(token, addresses);
+ }
+
+ function exposed_bound(int256 num, int256 min, int256 max) external pure returns (int256) {
+ return bound(num, min, max);
+ }
+
+ function exposed_bound(uint256 num, uint256 min, uint256 max) external pure returns (uint256) {
+ return bound(num, min, max);
+ }
+
+ function exposed_bytesToUint(bytes memory b) external pure returns (uint256) {
+ return bytesToUint(b);
+ }
+}
+
+contract StdUtilsTest is Test {
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND UINT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_Bound() public pure {
+ assertEq(bound(uint256(5), 0, 4), 0);
+ assertEq(bound(uint256(0), 69, 69), 69);
+ assertEq(bound(uint256(0), 68, 69), 68);
+ assertEq(bound(uint256(10), 150, 190), 174);
+ assertEq(bound(uint256(300), 2800, 3200), 3107);
+ assertEq(bound(uint256(9999), 1337, 6666), 4669);
+ }
+
+ function test_Bound_WithinRange() public pure {
+ assertEq(bound(uint256(51), 50, 150), 51);
+ assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150));
+ assertEq(bound(uint256(149), 50, 150), 149);
+ assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150));
+ }
+
+ function test_Bound_EdgeCoverage() public pure {
+ assertEq(bound(uint256(0), 50, 150), 50);
+ assertEq(bound(uint256(1), 50, 150), 51);
+ assertEq(bound(uint256(2), 50, 150), 52);
+ assertEq(bound(uint256(3), 50, 150), 53);
+ assertEq(bound(type(uint256).max, 50, 150), 150);
+ assertEq(bound(type(uint256).max - 1, 50, 150), 149);
+ assertEq(bound(type(uint256).max - 2, 50, 150), 148);
+ assertEq(bound(type(uint256).max - 3, 50, 150), 147);
+ }
+
+ function testFuzz_Bound_DistributionIsEven(uint256 min, uint256 size) public pure {
+ size = size % 100 + 1;
+ min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size);
+ uint256 max = min + size - 1;
+ uint256 result;
+
+ for (uint256 i = 1; i <= size * 4; ++i) {
+ // x > max
+ result = bound(max + i, min, max);
+ assertEq(result, min + (i - 1) % size);
+ // x < min
+ result = bound(min - i, min, max);
+ assertEq(result, max - (i - 1) % size);
+ }
+ }
+
+ function testFuzz_Bound(uint256 num, uint256 min, uint256 max) public pure {
+ if (min > max) (min, max) = (max, min);
+
+ uint256 result = bound(num, min, max);
+
+ assertGe(result, min);
+ assertLe(result, max);
+ assertEq(result, bound(result, min, max));
+ if (num >= min && num <= max) assertEq(result, num);
+ }
+
+ function test_BoundUint256Max() public pure {
+ assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1);
+ assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max);
+ }
+
+ function test_RevertIf_BoundMaxLessThanMin() public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min."));
+ stdUtils.exposed_bound(uint256(5), 100, 10);
+ }
+
+ function testFuzz_RevertIf_BoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.assume(min > max);
+ vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min."));
+ stdUtils.exposed_bound(num, min, max);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND INT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BoundInt() public pure {
+ assertEq(bound(-3, 0, 4), 2);
+ assertEq(bound(0, -69, -69), -69);
+ assertEq(bound(0, -69, -68), -68);
+ assertEq(bound(-10, 150, 190), 154);
+ assertEq(bound(-300, 2800, 3200), 2908);
+ assertEq(bound(9999, -1337, 6666), 1995);
+ }
+
+ function test_BoundInt_WithinRange() public pure {
+ assertEq(bound(51, -50, 150), 51);
+ assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150));
+ assertEq(bound(149, -50, 150), 149);
+ assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150));
+ }
+
+ function test_BoundInt_EdgeCoverage() public pure {
+ assertEq(bound(type(int256).min, -50, 150), -50);
+ assertEq(bound(type(int256).min + 1, -50, 150), -49);
+ assertEq(bound(type(int256).min + 2, -50, 150), -48);
+ assertEq(bound(type(int256).min + 3, -50, 150), -47);
+ assertEq(bound(type(int256).min, 10, 150), 10);
+ assertEq(bound(type(int256).min + 1, 10, 150), 11);
+ assertEq(bound(type(int256).min + 2, 10, 150), 12);
+ assertEq(bound(type(int256).min + 3, 10, 150), 13);
+
+ assertEq(bound(type(int256).max, -50, 150), 150);
+ assertEq(bound(type(int256).max - 1, -50, 150), 149);
+ assertEq(bound(type(int256).max - 2, -50, 150), 148);
+ assertEq(bound(type(int256).max - 3, -50, 150), 147);
+ assertEq(bound(type(int256).max, -50, -10), -10);
+ assertEq(bound(type(int256).max - 1, -50, -10), -11);
+ assertEq(bound(type(int256).max - 2, -50, -10), -12);
+ assertEq(bound(type(int256).max - 3, -50, -10), -13);
+ }
+
+ function testFuzz_BoundInt_DistributionIsEven(int256 min, uint256 size) public pure {
+ size = size % 100 + 1;
+ min = bound(min, -int256(size / 2), int256(size - size / 2));
+ int256 max = min + int256(size) - 1;
+ int256 result;
+
+ for (uint256 i = 1; i <= size * 4; ++i) {
+ // x > max
+ result = bound(max + int256(i), min, max);
+ assertEq(result, min + int256((i - 1) % size));
+ // x < min
+ result = bound(min - int256(i), min, max);
+ assertEq(result, max - int256((i - 1) % size));
+ }
+ }
+
+ function testFuzz_BoundInt(int256 num, int256 min, int256 max) public pure {
+ if (min > max) (min, max) = (max, min);
+
+ int256 result = bound(num, min, max);
+
+ assertGe(result, min);
+ assertLe(result, max);
+ assertEq(result, bound(result, min, max));
+ if (num >= min && num <= max) assertEq(result, num);
+ }
+
+ function test_BoundIntInt256Max() public pure {
+ assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1);
+ assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max);
+ }
+
+ function test_BoundIntInt256Min() public pure {
+ assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min);
+ assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1);
+ }
+
+ function test_RevertIf_BoundIntMaxLessThanMin() public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min."));
+ stdUtils.exposed_bound(-5, 100, 10);
+ }
+
+ function testFuzz_RevertIf_BoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ vm.assume(min > max);
+ vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min."));
+ stdUtils.exposed_bound(num, min, max);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BOUND PRIVATE KEY
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BoundPrivateKey() public pure {
+ assertEq(boundPrivateKey(0), 1);
+ assertEq(boundPrivateKey(1), 1);
+ assertEq(boundPrivateKey(300), 300);
+ assertEq(boundPrivateKey(9999), 9999);
+ assertEq(boundPrivateKey(SECP256K1_ORDER - 1), SECP256K1_ORDER - 1);
+ assertEq(boundPrivateKey(SECP256K1_ORDER), 1);
+ assertEq(boundPrivateKey(SECP256K1_ORDER + 1), 2);
+ assertEq(boundPrivateKey(UINT256_MAX), UINT256_MAX & SECP256K1_ORDER - 1); // x&y is equivalent to x-x%y
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ BYTES TO UINT
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_BytesToUint() external pure {
+ bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ bytes memory two = hex"02";
+ bytes memory millionEther = hex"d3c21bcecceda1000000";
+
+ assertEq(bytesToUint(maxUint), type(uint256).max);
+ assertEq(bytesToUint(two), 2);
+ assertEq(bytesToUint(millionEther), 1_000_000 ether);
+ }
+
+ function test_RevertIf_BytesLengthExceeds32() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32.");
+ stdUtils.exposed_bytesToUint(thirty3Bytes);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ COMPUTE CREATE ADDRESS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_ComputeCreateAddress() external pure {
+ address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9;
+ uint256 nonce = 14;
+ address createAddress = computeCreateAddress(deployer, nonce);
+ assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ COMPUTE CREATE2 ADDRESS
+ //////////////////////////////////////////////////////////////////////////*/
+
+ function test_ComputeCreate2Address() external pure {
+ bytes32 salt = bytes32(uint256(31415));
+ bytes32 initcodeHash = keccak256(abi.encode(0x6080));
+ address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9;
+ address create2Address = computeCreate2Address(salt, initcodeHash, deployer);
+ assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3);
+ }
+
+ function test_ComputeCreate2AddressWithDefaultDeployer() external pure {
+ bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0;
+ bytes32 initcodeHash = hashInitCode(hex"6080", "");
+ assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0);
+ address create2Address = computeCreate2Address(salt, initcodeHash);
+ assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6);
+ }
+}
+
+contract StdUtilsForkTest is Test {
+ /*//////////////////////////////////////////////////////////////////////////
+ GET TOKEN BALANCES
+ //////////////////////////////////////////////////////////////////////////*/
+
+ address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
+ address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170;
+ address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA;
+ address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385;
+
+ address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
+ address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17;
+ address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52;
+
+ function setUp() public {
+ // All tests of the `getTokenBalances` method are fork tests using live contracts.
+ vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900});
+ }
+
+ function test_RevertIf_CannotGetTokenBalances_NonTokenContract() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function,
+ // so the `balanceOf` call should revert.
+ address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
+ address[] memory addresses = new address[](1);
+ addresses[0] = USDC_HOLDER_0;
+
+ vm.expectRevert("Multicall3: call failed");
+ stdUtils.exposed_getTokenBalances(token, addresses);
+ }
+
+ function test_RevertIf_CannotGetTokenBalances_EOA() external {
+ // We deploy a mock version so we can properly test the revert.
+ StdUtilsMock stdUtils = new StdUtilsMock();
+
+ address eoa = vm.addr({privateKey: 1});
+ address[] memory addresses = new address[](1);
+ addresses[0] = USDC_HOLDER_0;
+ vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract.");
+ stdUtils.exposed_getTokenBalances(eoa, addresses);
+ }
+
+ function test_GetTokenBalances_Empty() external {
+ address[] memory addresses = new address[](0);
+ uint256[] memory balances = getTokenBalances(USDC, addresses);
+ assertEq(balances.length, 0);
+ }
+
+ function test_GetTokenBalances_USDC() external {
+ address[] memory addresses = new address[](2);
+ addresses[0] = USDC_HOLDER_0;
+ addresses[1] = USDC_HOLDER_1;
+ uint256[] memory balances = getTokenBalances(USDC, addresses);
+ assertEq(balances[0], 159_000_000_000_000);
+ assertEq(balances[1], 131_350_000_000_000);
+ }
+
+ function test_GetTokenBalances_SHIB() external {
+ address[] memory addresses = new address[](3);
+ addresses[0] = SHIB_HOLDER_0;
+ addresses[1] = SHIB_HOLDER_1;
+ addresses[2] = SHIB_HOLDER_2;
+ uint256[] memory balances = getTokenBalances(SHIB, addresses);
+ assertEq(balances[0], 3_323_256_285_484.42e18);
+ assertEq(balances[1], 1_271_702_771_149.99999928e18);
+ assertEq(balances[2], 606_357_106_247e18);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/Vm.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/Vm.t.sol
new file mode 100644
index 000000000..7135409db
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/Vm.t.sol
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.8.0 <0.9.0;
+
+import {Test} from "../src/Test.sol";
+import {Vm, VmSafe} from "../src/Vm.sol";
+
+// These tests ensure that functions are never accidentally removed from a Vm interface, or
+// inadvertently moved between Vm and VmSafe. These tests must be updated each time a function is
+// added to or removed from Vm or VmSafe.
+contract VmTest is Test {
+ function test_VmInterfaceId() public pure {
+ assertEq(type(Vm).interfaceId, bytes4(0xa561dbe8), "Vm");
+ }
+
+ function test_VmSafeInterfaceId() public pure {
+ assertEq(type(VmSafe).interfaceId, bytes4(0x681d10d4), "VmSafe");
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScript.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScript.sol
new file mode 100644
index 000000000..e205cfff3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScript.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import "../../src/Script.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationScript is Script {}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol
new file mode 100644
index 000000000..ce8e0e954
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import "../../src/Script.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationScriptBase is ScriptBase {}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTest.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTest.sol
new file mode 100644
index 000000000..9beeafeb7
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTest.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import "../../src/Test.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationTest is Test {}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol
new file mode 100644
index 000000000..e993535bc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.2 <0.9.0;
+
+pragma experimental ABIEncoderV2;
+
+import "../../src/Test.sol";
+
+// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing
+// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207
+contract CompilationTestBase is TestBase {}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/broadcast.log.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/broadcast.log.json
new file mode 100644
index 000000000..0a0200bca
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/broadcast.log.json
@@ -0,0 +1,187 @@
+{
+ "transactions": [
+ {
+ "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "function": "multiple_arguments(uint256,address,uint256[]):(uint256)",
+ "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "gas": "0x73b9",
+ "value": "0x0",
+ "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004",
+ "nonce": "0x3",
+ "accessList": []
+ }
+ },
+ {
+ "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "function": "inc():(uint256)",
+ "arguments": [],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "gas": "0xdcb2",
+ "value": "0x0",
+ "data": "0x371303c0",
+ "nonce": "0x4",
+ "accessList": []
+ }
+ },
+ {
+ "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "type": "CALL",
+ "contractName": "Test",
+ "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "function": "t(uint256):(uint256)",
+ "arguments": ["1"],
+ "tx": {
+ "type": "0x02",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "gas": "0x8599",
+ "value": "0x0",
+ "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001",
+ "nonce": "0x5",
+ "accessList": []
+ }
+ }
+ ],
+ "receipts": [
+ {
+ "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181",
+ "transactionIndex": "0x0",
+ "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af",
+ "blockNumber": "0x1",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": null,
+ "cumulativeGasUsed": "0x13f3a",
+ "gasUsed": "0x13f3a",
+ "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782",
+ "transactionIndex": "0x0",
+ "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148",
+ "blockNumber": "0x2",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": null,
+ "cumulativeGasUsed": "0x45d80",
+ "gasUsed": "0x45d80",
+ "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d",
+ "transactionIndex": "0x0",
+ "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58",
+ "blockNumber": "0x3",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
+ "cumulativeGasUsed": "0x45feb",
+ "gasUsed": "0x45feb",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f",
+ "transactionIndex": "0x0",
+ "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629",
+ "blockNumber": "0x4",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "cumulativeGasUsed": "0x5905",
+ "gasUsed": "0x5905",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298",
+ "transactionIndex": "0x0",
+ "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11",
+ "blockNumber": "0x5",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
+ "cumulativeGasUsed": "0xa9c4",
+ "gasUsed": "0xa9c4",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "transactionIndex": "0x0",
+ "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb",
+ "blockNumber": "0x6",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "cumulativeGasUsed": "0x66c5",
+ "gasUsed": "0x66c5",
+ "contractAddress": null,
+ "logs": [
+ {
+ "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087",
+ "topics": [
+ "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b"
+ ],
+ "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000",
+ "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb",
+ "blockNumber": "0x6",
+ "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c",
+ "transactionIndex": "0x1",
+ "logIndex": "0x0",
+ "transactionLogIndex": "0x0",
+ "removed": false
+ }
+ ],
+ "status": "0x1",
+ "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100",
+ "effectiveGasPrice": "0xee6b2800"
+ },
+ {
+ "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16",
+ "transactionIndex": "0x0",
+ "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c",
+ "blockNumber": "0x7",
+ "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "to": "0x0000000000000000000000000000000000001337",
+ "cumulativeGasUsed": "0x5208",
+ "gasUsed": "0x5208",
+ "contractAddress": null,
+ "logs": [],
+ "status": "0x1",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "effectiveGasPrice": "0xee6b2800"
+ }
+ ],
+ "libraries": [
+ "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3"
+ ],
+ "pending": [],
+ "path": "broadcast/Broadcast.t.sol/31337/run-latest.json",
+ "returns": {},
+ "timestamp": 1655140035
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.json
new file mode 100644
index 000000000..caebf6d96
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.json
@@ -0,0 +1,8 @@
+{
+ "a": 123,
+ "b": "test",
+ "c": {
+ "a": 123,
+ "b": "test"
+ }
+}
\ No newline at end of file
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.toml b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.toml
new file mode 100644
index 000000000..60692bc75
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.toml
@@ -0,0 +1,6 @@
+a = 123
+b = "test"
+
+[c]
+a = 123
+b = "test"
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/mocks/MockERC20.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/mocks/MockERC20.t.sol
new file mode 100644
index 000000000..e24681093
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/mocks/MockERC20.t.sol
@@ -0,0 +1,441 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {MockERC20} from "../../src/mocks/MockERC20.sol";
+import {StdCheats} from "../../src/StdCheats.sol";
+import {Test} from "../../src/Test.sol";
+
+contract Token_ERC20 is MockERC20 {
+ constructor(string memory name, string memory symbol, uint8 decimals) {
+ initialize(name, symbol, decimals);
+ }
+
+ function mint(address to, uint256 value) public virtual {
+ _mint(to, value);
+ }
+
+ function burn(address from, uint256 value) public virtual {
+ _burn(from, value);
+ }
+}
+
+contract MockERC20Test is StdCheats, Test {
+ Token_ERC20 token;
+
+ bytes32 constant PERMIT_TYPEHASH =
+ keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
+
+ function setUp() public {
+ token = new Token_ERC20("Token", "TKN", 18);
+ }
+
+ function invariantMetadata() public view {
+ assertEq(token.name(), "Token");
+ assertEq(token.symbol(), "TKN");
+ assertEq(token.decimals(), 18);
+ }
+
+ function testMint() public {
+ token.mint(address(0xBEEF), 1e18);
+
+ assertEq(token.totalSupply(), 1e18);
+ assertEq(token.balanceOf(address(0xBEEF)), 1e18);
+ }
+
+ function testBurn() public {
+ token.mint(address(0xBEEF), 1e18);
+ token.burn(address(0xBEEF), 0.9e18);
+
+ assertEq(token.totalSupply(), 1e18 - 0.9e18);
+ assertEq(token.balanceOf(address(0xBEEF)), 0.1e18);
+ }
+
+ function testApprove() public {
+ assertTrue(token.approve(address(0xBEEF), 1e18));
+
+ assertEq(token.allowance(address(this), address(0xBEEF)), 1e18);
+ }
+
+ function testTransfer() public {
+ token.mint(address(this), 1e18);
+
+ assertTrue(token.transfer(address(0xBEEF), 1e18));
+ assertEq(token.totalSupply(), 1e18);
+
+ assertEq(token.balanceOf(address(this)), 0);
+ assertEq(token.balanceOf(address(0xBEEF)), 1e18);
+ }
+
+ function testTransferFrom() public {
+ address from = address(0xABCD);
+
+ token.mint(from, 1e18);
+
+ vm.prank(from);
+ token.approve(address(this), 1e18);
+
+ assertTrue(token.transferFrom(from, address(0xBEEF), 1e18));
+ assertEq(token.totalSupply(), 1e18);
+
+ assertEq(token.allowance(from, address(this)), 0);
+
+ assertEq(token.balanceOf(from), 0);
+ assertEq(token.balanceOf(address(0xBEEF)), 1e18);
+ }
+
+ function testInfiniteApproveTransferFrom() public {
+ address from = address(0xABCD);
+
+ token.mint(from, 1e18);
+
+ vm.prank(from);
+ token.approve(address(this), type(uint256).max);
+
+ assertTrue(token.transferFrom(from, address(0xBEEF), 1e18));
+ assertEq(token.totalSupply(), 1e18);
+
+ assertEq(token.allowance(from, address(this)), type(uint256).max);
+
+ assertEq(token.balanceOf(from), 0);
+ assertEq(token.balanceOf(address(0xBEEF)), 1e18);
+ }
+
+ function testPermit() public {
+ uint256 privateKey = 0xBEEF;
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp))
+ )
+ )
+ );
+
+ token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s);
+
+ assertEq(token.allowance(owner, address(0xCAFE)), 1e18);
+ assertEq(token.nonces(owner), 1);
+ }
+
+ function testFailTransferInsufficientBalance() public {
+ token.mint(address(this), 0.9e18);
+ token.transfer(address(0xBEEF), 1e18);
+ }
+
+ function testFailTransferFromInsufficientAllowance() public {
+ address from = address(0xABCD);
+
+ token.mint(from, 1e18);
+
+ vm.prank(from);
+ token.approve(address(this), 0.9e18);
+
+ token.transferFrom(from, address(0xBEEF), 1e18);
+ }
+
+ function testFailTransferFromInsufficientBalance() public {
+ address from = address(0xABCD);
+
+ token.mint(from, 0.9e18);
+
+ vm.prank(from);
+ token.approve(address(this), 1e18);
+
+ token.transferFrom(from, address(0xBEEF), 1e18);
+ }
+
+ function testFailPermitBadNonce() public {
+ uint256 privateKey = 0xBEEF;
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 1, block.timestamp))
+ )
+ )
+ );
+
+ token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s);
+ }
+
+ function testFailPermitBadDeadline() public {
+ uint256 privateKey = 0xBEEF;
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp))
+ )
+ )
+ );
+
+ token.permit(owner, address(0xCAFE), 1e18, block.timestamp + 1, v, r, s);
+ }
+
+ function testFailPermitPastDeadline() public {
+ uint256 oldTimestamp = block.timestamp;
+ uint256 privateKey = 0xBEEF;
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, oldTimestamp))
+ )
+ )
+ );
+
+ vm.warp(block.timestamp + 1);
+ token.permit(owner, address(0xCAFE), 1e18, oldTimestamp, v, r, s);
+ }
+
+ function testFailPermitReplay() public {
+ uint256 privateKey = 0xBEEF;
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp))
+ )
+ )
+ );
+
+ token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s);
+ token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s);
+ }
+
+ function testMetadata(string calldata name, string calldata symbol, uint8 decimals) public {
+ Token_ERC20 tkn = new Token_ERC20(name, symbol, decimals);
+ assertEq(tkn.name(), name);
+ assertEq(tkn.symbol(), symbol);
+ assertEq(tkn.decimals(), decimals);
+ }
+
+ function testMint(address from, uint256 amount) public {
+ token.mint(from, amount);
+
+ assertEq(token.totalSupply(), amount);
+ assertEq(token.balanceOf(from), amount);
+ }
+
+ function testBurn(address from, uint256 mintAmount, uint256 burnAmount) public {
+ burnAmount = bound(burnAmount, 0, mintAmount);
+
+ token.mint(from, mintAmount);
+ token.burn(from, burnAmount);
+
+ assertEq(token.totalSupply(), mintAmount - burnAmount);
+ assertEq(token.balanceOf(from), mintAmount - burnAmount);
+ }
+
+ function testApprove(address to, uint256 amount) public {
+ assertTrue(token.approve(to, amount));
+
+ assertEq(token.allowance(address(this), to), amount);
+ }
+
+ function testTransfer(address from, uint256 amount) public {
+ token.mint(address(this), amount);
+
+ assertTrue(token.transfer(from, amount));
+ assertEq(token.totalSupply(), amount);
+
+ if (address(this) == from) {
+ assertEq(token.balanceOf(address(this)), amount);
+ } else {
+ assertEq(token.balanceOf(address(this)), 0);
+ assertEq(token.balanceOf(from), amount);
+ }
+ }
+
+ function testTransferFrom(address to, uint256 approval, uint256 amount) public {
+ amount = bound(amount, 0, approval);
+
+ address from = address(0xABCD);
+
+ token.mint(from, amount);
+
+ vm.prank(from);
+ token.approve(address(this), approval);
+
+ assertTrue(token.transferFrom(from, to, amount));
+ assertEq(token.totalSupply(), amount);
+
+ uint256 app = from == address(this) || approval == type(uint256).max ? approval : approval - amount;
+ assertEq(token.allowance(from, address(this)), app);
+
+ if (from == to) {
+ assertEq(token.balanceOf(from), amount);
+ } else {
+ assertEq(token.balanceOf(from), 0);
+ assertEq(token.balanceOf(to), amount);
+ }
+ }
+
+ function testPermit(uint248 privKey, address to, uint256 amount, uint256 deadline) public {
+ uint256 privateKey = privKey;
+ if (deadline < block.timestamp) deadline = block.timestamp;
+ if (privateKey == 0) privateKey = 1;
+
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline))
+ )
+ )
+ );
+
+ token.permit(owner, to, amount, deadline, v, r, s);
+
+ assertEq(token.allowance(owner, to), amount);
+ assertEq(token.nonces(owner), 1);
+ }
+
+ function testFailBurnInsufficientBalance(address to, uint256 mintAmount, uint256 burnAmount) public {
+ burnAmount = bound(burnAmount, mintAmount + 1, type(uint256).max);
+
+ token.mint(to, mintAmount);
+ token.burn(to, burnAmount);
+ }
+
+ function testFailTransferInsufficientBalance(address to, uint256 mintAmount, uint256 sendAmount) public {
+ sendAmount = bound(sendAmount, mintAmount + 1, type(uint256).max);
+
+ token.mint(address(this), mintAmount);
+ token.transfer(to, sendAmount);
+ }
+
+ function testFailTransferFromInsufficientAllowance(address to, uint256 approval, uint256 amount) public {
+ amount = bound(amount, approval + 1, type(uint256).max);
+
+ address from = address(0xABCD);
+
+ token.mint(from, amount);
+
+ vm.prank(from);
+ token.approve(address(this), approval);
+
+ token.transferFrom(from, to, amount);
+ }
+
+ function testFailTransferFromInsufficientBalance(address to, uint256 mintAmount, uint256 sendAmount) public {
+ sendAmount = bound(sendAmount, mintAmount + 1, type(uint256).max);
+
+ address from = address(0xABCD);
+
+ token.mint(from, mintAmount);
+
+ vm.prank(from);
+ token.approve(address(this), sendAmount);
+
+ token.transferFrom(from, to, sendAmount);
+ }
+
+ function testFailPermitBadNonce(uint256 privateKey, address to, uint256 amount, uint256 deadline, uint256 nonce)
+ public
+ {
+ if (deadline < block.timestamp) deadline = block.timestamp;
+ if (privateKey == 0) privateKey = 1;
+ if (nonce == 0) nonce = 1;
+
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, nonce, deadline))
+ )
+ )
+ );
+
+ token.permit(owner, to, amount, deadline, v, r, s);
+ }
+
+ function testFailPermitBadDeadline(uint256 privateKey, address to, uint256 amount, uint256 deadline) public {
+ if (deadline < block.timestamp) deadline = block.timestamp;
+ if (privateKey == 0) privateKey = 1;
+
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline))
+ )
+ )
+ );
+
+ token.permit(owner, to, amount, deadline + 1, v, r, s);
+ }
+
+ function testFailPermitPastDeadline(uint256 privateKey, address to, uint256 amount, uint256 deadline) public {
+ deadline = bound(deadline, 0, block.timestamp - 1);
+ if (privateKey == 0) privateKey = 1;
+
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline))
+ )
+ )
+ );
+
+ token.permit(owner, to, amount, deadline, v, r, s);
+ }
+
+ function testFailPermitReplay(uint256 privateKey, address to, uint256 amount, uint256 deadline) public {
+ if (deadline < block.timestamp) deadline = block.timestamp;
+ if (privateKey == 0) privateKey = 1;
+
+ address owner = vm.addr(privateKey);
+
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(
+ privateKey,
+ keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ token.DOMAIN_SEPARATOR(),
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline))
+ )
+ )
+ );
+
+ token.permit(owner, to, amount, deadline, v, r, s);
+ token.permit(owner, to, amount, deadline, v, r, s);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/mocks/MockERC721.t.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/mocks/MockERC721.t.sol
new file mode 100644
index 000000000..f986d7967
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/mocks/MockERC721.t.sol
@@ -0,0 +1,721 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0 <0.9.0;
+
+import {MockERC721, IERC721TokenReceiver} from "../../src/mocks/MockERC721.sol";
+import {StdCheats} from "../../src/StdCheats.sol";
+import {Test} from "../../src/Test.sol";
+
+contract ERC721Recipient is IERC721TokenReceiver {
+ address public operator;
+ address public from;
+ uint256 public id;
+ bytes public data;
+
+ function onERC721Received(address _operator, address _from, uint256 _id, bytes calldata _data)
+ public
+ virtual
+ override
+ returns (bytes4)
+ {
+ operator = _operator;
+ from = _from;
+ id = _id;
+ data = _data;
+
+ return IERC721TokenReceiver.onERC721Received.selector;
+ }
+}
+
+contract RevertingERC721Recipient is IERC721TokenReceiver {
+ function onERC721Received(address, address, uint256, bytes calldata) public virtual override returns (bytes4) {
+ revert(string(abi.encodePacked(IERC721TokenReceiver.onERC721Received.selector)));
+ }
+}
+
+contract WrongReturnDataERC721Recipient is IERC721TokenReceiver {
+ function onERC721Received(address, address, uint256, bytes calldata) public virtual override returns (bytes4) {
+ return 0xCAFEBEEF;
+ }
+}
+
+contract NonERC721Recipient {}
+
+contract Token_ERC721 is MockERC721 {
+ constructor(string memory _name, string memory _symbol) {
+ initialize(_name, _symbol);
+ }
+
+ function tokenURI(uint256) public pure virtual override returns (string memory) {}
+
+ function mint(address to, uint256 tokenId) public virtual {
+ _mint(to, tokenId);
+ }
+
+ function burn(uint256 tokenId) public virtual {
+ _burn(tokenId);
+ }
+
+ function safeMint(address to, uint256 tokenId) public virtual {
+ _safeMint(to, tokenId);
+ }
+
+ function safeMint(address to, uint256 tokenId, bytes memory data) public virtual {
+ _safeMint(to, tokenId, data);
+ }
+}
+
+contract MockERC721Test is StdCheats, Test {
+ Token_ERC721 token;
+
+ function setUp() public {
+ token = new Token_ERC721("Token", "TKN");
+ }
+
+ function invariantMetadata() public view {
+ assertEq(token.name(), "Token");
+ assertEq(token.symbol(), "TKN");
+ }
+
+ function testMint() public {
+ token.mint(address(0xBEEF), 1337);
+
+ assertEq(token.balanceOf(address(0xBEEF)), 1);
+ assertEq(token.ownerOf(1337), address(0xBEEF));
+ }
+
+ function testBurn() public {
+ token.mint(address(0xBEEF), 1337);
+ token.burn(1337);
+
+ assertEq(token.balanceOf(address(0xBEEF)), 0);
+
+ vm.expectRevert("NOT_MINTED");
+ token.ownerOf(1337);
+ }
+
+ function testApprove() public {
+ token.mint(address(this), 1337);
+
+ token.approve(address(0xBEEF), 1337);
+
+ assertEq(token.getApproved(1337), address(0xBEEF));
+ }
+
+ function testApproveBurn() public {
+ token.mint(address(this), 1337);
+
+ token.approve(address(0xBEEF), 1337);
+
+ token.burn(1337);
+
+ assertEq(token.balanceOf(address(this)), 0);
+ assertEq(token.getApproved(1337), address(0));
+
+ vm.expectRevert("NOT_MINTED");
+ token.ownerOf(1337);
+ }
+
+ function testApproveAll() public {
+ token.setApprovalForAll(address(0xBEEF), true);
+
+ assertTrue(token.isApprovedForAll(address(this), address(0xBEEF)));
+ }
+
+ function testTransferFrom() public {
+ address from = address(0xABCD);
+
+ token.mint(from, 1337);
+
+ vm.prank(from);
+ token.approve(address(this), 1337);
+
+ token.transferFrom(from, address(0xBEEF), 1337);
+
+ assertEq(token.getApproved(1337), address(0));
+ assertEq(token.ownerOf(1337), address(0xBEEF));
+ assertEq(token.balanceOf(address(0xBEEF)), 1);
+ assertEq(token.balanceOf(from), 0);
+ }
+
+ function testTransferFromSelf() public {
+ token.mint(address(this), 1337);
+
+ token.transferFrom(address(this), address(0xBEEF), 1337);
+
+ assertEq(token.getApproved(1337), address(0));
+ assertEq(token.ownerOf(1337), address(0xBEEF));
+ assertEq(token.balanceOf(address(0xBEEF)), 1);
+ assertEq(token.balanceOf(address(this)), 0);
+ }
+
+ function testTransferFromApproveAll() public {
+ address from = address(0xABCD);
+
+ token.mint(from, 1337);
+
+ vm.prank(from);
+ token.setApprovalForAll(address(this), true);
+
+ token.transferFrom(from, address(0xBEEF), 1337);
+
+ assertEq(token.getApproved(1337), address(0));
+ assertEq(token.ownerOf(1337), address(0xBEEF));
+ assertEq(token.balanceOf(address(0xBEEF)), 1);
+ assertEq(token.balanceOf(from), 0);
+ }
+
+ function testSafeTransferFromToEOA() public {
+ address from = address(0xABCD);
+
+ token.mint(from, 1337);
+
+ vm.prank(from);
+ token.setApprovalForAll(address(this), true);
+
+ token.safeTransferFrom(from, address(0xBEEF), 1337);
+
+ assertEq(token.getApproved(1337), address(0));
+ assertEq(token.ownerOf(1337), address(0xBEEF));
+ assertEq(token.balanceOf(address(0xBEEF)), 1);
+ assertEq(token.balanceOf(from), 0);
+ }
+
+ function testSafeTransferFromToERC721Recipient() public {
+ address from = address(0xABCD);
+ ERC721Recipient recipient = new ERC721Recipient();
+
+ token.mint(from, 1337);
+
+ vm.prank(from);
+ token.setApprovalForAll(address(this), true);
+
+ token.safeTransferFrom(from, address(recipient), 1337);
+
+ assertEq(token.getApproved(1337), address(0));
+ assertEq(token.ownerOf(1337), address(recipient));
+ assertEq(token.balanceOf(address(recipient)), 1);
+ assertEq(token.balanceOf(from), 0);
+
+ assertEq(recipient.operator(), address(this));
+ assertEq(recipient.from(), from);
+ assertEq(recipient.id(), 1337);
+ assertEq(recipient.data(), "");
+ }
+
+ function testSafeTransferFromToERC721RecipientWithData() public {
+ address from = address(0xABCD);
+ ERC721Recipient recipient = new ERC721Recipient();
+
+ token.mint(from, 1337);
+
+ vm.prank(from);
+ token.setApprovalForAll(address(this), true);
+
+ token.safeTransferFrom(from, address(recipient), 1337, "testing 123");
+
+ assertEq(token.getApproved(1337), address(0));
+ assertEq(token.ownerOf(1337), address(recipient));
+ assertEq(token.balanceOf(address(recipient)), 1);
+ assertEq(token.balanceOf(from), 0);
+
+ assertEq(recipient.operator(), address(this));
+ assertEq(recipient.from(), from);
+ assertEq(recipient.id(), 1337);
+ assertEq(recipient.data(), "testing 123");
+ }
+
+ function testSafeMintToEOA() public {
+ token.safeMint(address(0xBEEF), 1337);
+
+ assertEq(token.ownerOf(1337), address(address(0xBEEF)));
+ assertEq(token.balanceOf(address(address(0xBEEF))), 1);
+ }
+
+ function testSafeMintToERC721Recipient() public {
+ ERC721Recipient to = new ERC721Recipient();
+
+ token.safeMint(address(to), 1337);
+
+ assertEq(token.ownerOf(1337), address(to));
+ assertEq(token.balanceOf(address(to)), 1);
+
+ assertEq(to.operator(), address(this));
+ assertEq(to.from(), address(0));
+ assertEq(to.id(), 1337);
+ assertEq(to.data(), "");
+ }
+
+ function testSafeMintToERC721RecipientWithData() public {
+ ERC721Recipient to = new ERC721Recipient();
+
+ token.safeMint(address(to), 1337, "testing 123");
+
+ assertEq(token.ownerOf(1337), address(to));
+ assertEq(token.balanceOf(address(to)), 1);
+
+ assertEq(to.operator(), address(this));
+ assertEq(to.from(), address(0));
+ assertEq(to.id(), 1337);
+ assertEq(to.data(), "testing 123");
+ }
+
+ function testFailMintToZero() public {
+ token.mint(address(0), 1337);
+ }
+
+ function testFailDoubleMint() public {
+ token.mint(address(0xBEEF), 1337);
+ token.mint(address(0xBEEF), 1337);
+ }
+
+ function testFailBurnUnMinted() public {
+ token.burn(1337);
+ }
+
+ function testFailDoubleBurn() public {
+ token.mint(address(0xBEEF), 1337);
+
+ token.burn(1337);
+ token.burn(1337);
+ }
+
+ function testFailApproveUnMinted() public {
+ token.approve(address(0xBEEF), 1337);
+ }
+
+ function testFailApproveUnAuthorized() public {
+ token.mint(address(0xCAFE), 1337);
+
+ token.approve(address(0xBEEF), 1337);
+ }
+
+ function testFailTransferFromUnOwned() public {
+ token.transferFrom(address(0xFEED), address(0xBEEF), 1337);
+ }
+
+ function testFailTransferFromWrongFrom() public {
+ token.mint(address(0xCAFE), 1337);
+
+ token.transferFrom(address(0xFEED), address(0xBEEF), 1337);
+ }
+
+ function testFailTransferFromToZero() public {
+ token.mint(address(this), 1337);
+
+ token.transferFrom(address(this), address(0), 1337);
+ }
+
+ function testFailTransferFromNotOwner() public {
+ token.mint(address(0xFEED), 1337);
+
+ token.transferFrom(address(0xFEED), address(0xBEEF), 1337);
+ }
+
+ function testFailSafeTransferFromToNonERC721Recipient() public {
+ token.mint(address(this), 1337);
+
+ token.safeTransferFrom(address(this), address(new NonERC721Recipient()), 1337);
+ }
+
+ function testFailSafeTransferFromToNonERC721RecipientWithData() public {
+ token.mint(address(this), 1337);
+
+ token.safeTransferFrom(address(this), address(new NonERC721Recipient()), 1337, "testing 123");
+ }
+
+ function testFailSafeTransferFromToRevertingERC721Recipient() public {
+ token.mint(address(this), 1337);
+
+ token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), 1337);
+ }
+
+ function testFailSafeTransferFromToRevertingERC721RecipientWithData() public {
+ token.mint(address(this), 1337);
+
+ token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), 1337, "testing 123");
+ }
+
+ function testFailSafeTransferFromToERC721RecipientWithWrongReturnData() public {
+ token.mint(address(this), 1337);
+
+ token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), 1337);
+ }
+
+ function testFailSafeTransferFromToERC721RecipientWithWrongReturnDataWithData() public {
+ token.mint(address(this), 1337);
+
+ token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), 1337, "testing 123");
+ }
+
+ function testFailSafeMintToNonERC721Recipient() public {
+ token.safeMint(address(new NonERC721Recipient()), 1337);
+ }
+
+ function testFailSafeMintToNonERC721RecipientWithData() public {
+ token.safeMint(address(new NonERC721Recipient()), 1337, "testing 123");
+ }
+
+ function testFailSafeMintToRevertingERC721Recipient() public {
+ token.safeMint(address(new RevertingERC721Recipient()), 1337);
+ }
+
+ function testFailSafeMintToRevertingERC721RecipientWithData() public {
+ token.safeMint(address(new RevertingERC721Recipient()), 1337, "testing 123");
+ }
+
+ function testFailSafeMintToERC721RecipientWithWrongReturnData() public {
+ token.safeMint(address(new WrongReturnDataERC721Recipient()), 1337);
+ }
+
+ function testFailSafeMintToERC721RecipientWithWrongReturnDataWithData() public {
+ token.safeMint(address(new WrongReturnDataERC721Recipient()), 1337, "testing 123");
+ }
+
+ function testFailBalanceOfZeroAddress() public view {
+ token.balanceOf(address(0));
+ }
+
+ function testFailOwnerOfUnminted() public view {
+ token.ownerOf(1337);
+ }
+
+ function testMetadata(string memory name, string memory symbol) public {
+ MockERC721 tkn = new Token_ERC721(name, symbol);
+
+ assertEq(tkn.name(), name);
+ assertEq(tkn.symbol(), symbol);
+ }
+
+ function testMint(address to, uint256 id) public {
+ if (to == address(0)) to = address(0xBEEF);
+
+ token.mint(to, id);
+
+ assertEq(token.balanceOf(to), 1);
+ assertEq(token.ownerOf(id), to);
+ }
+
+ function testBurn(address to, uint256 id) public {
+ if (to == address(0)) to = address(0xBEEF);
+
+ token.mint(to, id);
+ token.burn(id);
+
+ assertEq(token.balanceOf(to), 0);
+
+ vm.expectRevert("NOT_MINTED");
+ token.ownerOf(id);
+ }
+
+ function testApprove(address to, uint256 id) public {
+ if (to == address(0)) to = address(0xBEEF);
+
+ token.mint(address(this), id);
+
+ token.approve(to, id);
+
+ assertEq(token.getApproved(id), to);
+ }
+
+ function testApproveBurn(address to, uint256 id) public {
+ token.mint(address(this), id);
+
+ token.approve(address(to), id);
+
+ token.burn(id);
+
+ assertEq(token.balanceOf(address(this)), 0);
+ assertEq(token.getApproved(id), address(0));
+
+ vm.expectRevert("NOT_MINTED");
+ token.ownerOf(id);
+ }
+
+ function testApproveAll(address to, bool approved) public {
+ token.setApprovalForAll(to, approved);
+
+ assertEq(token.isApprovedForAll(address(this), to), approved);
+ }
+
+ function testTransferFrom(uint256 id, address to) public {
+ address from = address(0xABCD);
+
+ if (to == address(0) || to == from) to = address(0xBEEF);
+
+ token.mint(from, id);
+
+ vm.prank(from);
+ token.approve(address(this), id);
+
+ token.transferFrom(from, to, id);
+
+ assertEq(token.getApproved(id), address(0));
+ assertEq(token.ownerOf(id), to);
+ assertEq(token.balanceOf(to), 1);
+ assertEq(token.balanceOf(from), 0);
+ }
+
+ function testTransferFromSelf(uint256 id, address to) public {
+ if (to == address(0) || to == address(this)) to = address(0xBEEF);
+
+ token.mint(address(this), id);
+
+ token.transferFrom(address(this), to, id);
+
+ assertEq(token.getApproved(id), address(0));
+ assertEq(token.ownerOf(id), to);
+ assertEq(token.balanceOf(to), 1);
+ assertEq(token.balanceOf(address(this)), 0);
+ }
+
+ function testTransferFromApproveAll(uint256 id, address to) public {
+ address from = address(0xABCD);
+
+ if (to == address(0) || to == from) to = address(0xBEEF);
+
+ token.mint(from, id);
+
+ vm.prank(from);
+ token.setApprovalForAll(address(this), true);
+
+ token.transferFrom(from, to, id);
+
+ assertEq(token.getApproved(id), address(0));
+ assertEq(token.ownerOf(id), to);
+ assertEq(token.balanceOf(to), 1);
+ assertEq(token.balanceOf(from), 0);
+ }
+
+ function testSafeTransferFromToEOA(uint256 id, address to) public {
+ address from = address(0xABCD);
+
+ if (to == address(0) || to == from) to = address(0xBEEF);
+
+ if (uint256(uint160(to)) <= 18 || to.code.length > 0) return;
+
+ token.mint(from, id);
+
+ vm.prank(from);
+ token.setApprovalForAll(address(this), true);
+
+ token.safeTransferFrom(from, to, id);
+
+ assertEq(token.getApproved(id), address(0));
+ assertEq(token.ownerOf(id), to);
+ assertEq(token.balanceOf(to), 1);
+ assertEq(token.balanceOf(from), 0);
+ }
+
+ function testSafeTransferFromToERC721Recipient(uint256 id) public {
+ address from = address(0xABCD);
+
+ ERC721Recipient recipient = new ERC721Recipient();
+
+ token.mint(from, id);
+
+ vm.prank(from);
+ token.setApprovalForAll(address(this), true);
+
+ token.safeTransferFrom(from, address(recipient), id);
+
+ assertEq(token.getApproved(id), address(0));
+ assertEq(token.ownerOf(id), address(recipient));
+ assertEq(token.balanceOf(address(recipient)), 1);
+ assertEq(token.balanceOf(from), 0);
+
+ assertEq(recipient.operator(), address(this));
+ assertEq(recipient.from(), from);
+ assertEq(recipient.id(), id);
+ assertEq(recipient.data(), "");
+ }
+
+ function testSafeTransferFromToERC721RecipientWithData(uint256 id, bytes calldata data) public {
+ address from = address(0xABCD);
+ ERC721Recipient recipient = new ERC721Recipient();
+
+ token.mint(from, id);
+
+ vm.prank(from);
+ token.setApprovalForAll(address(this), true);
+
+ token.safeTransferFrom(from, address(recipient), id, data);
+
+ assertEq(token.getApproved(id), address(0));
+ assertEq(token.ownerOf(id), address(recipient));
+ assertEq(token.balanceOf(address(recipient)), 1);
+ assertEq(token.balanceOf(from), 0);
+
+ assertEq(recipient.operator(), address(this));
+ assertEq(recipient.from(), from);
+ assertEq(recipient.id(), id);
+ assertEq(recipient.data(), data);
+ }
+
+ function testSafeMintToEOA(uint256 id, address to) public {
+ if (to == address(0)) to = address(0xBEEF);
+
+ if (uint256(uint160(to)) <= 18 || to.code.length > 0) return;
+
+ token.safeMint(to, id);
+
+ assertEq(token.ownerOf(id), address(to));
+ assertEq(token.balanceOf(address(to)), 1);
+ }
+
+ function testSafeMintToERC721Recipient(uint256 id) public {
+ ERC721Recipient to = new ERC721Recipient();
+
+ token.safeMint(address(to), id);
+
+ assertEq(token.ownerOf(id), address(to));
+ assertEq(token.balanceOf(address(to)), 1);
+
+ assertEq(to.operator(), address(this));
+ assertEq(to.from(), address(0));
+ assertEq(to.id(), id);
+ assertEq(to.data(), "");
+ }
+
+ function testSafeMintToERC721RecipientWithData(uint256 id, bytes calldata data) public {
+ ERC721Recipient to = new ERC721Recipient();
+
+ token.safeMint(address(to), id, data);
+
+ assertEq(token.ownerOf(id), address(to));
+ assertEq(token.balanceOf(address(to)), 1);
+
+ assertEq(to.operator(), address(this));
+ assertEq(to.from(), address(0));
+ assertEq(to.id(), id);
+ assertEq(to.data(), data);
+ }
+
+ function testFailMintToZero(uint256 id) public {
+ token.mint(address(0), id);
+ }
+
+ function testFailDoubleMint(uint256 id, address to) public {
+ if (to == address(0)) to = address(0xBEEF);
+
+ token.mint(to, id);
+ token.mint(to, id);
+ }
+
+ function testFailBurnUnMinted(uint256 id) public {
+ token.burn(id);
+ }
+
+ function testFailDoubleBurn(uint256 id, address to) public {
+ if (to == address(0)) to = address(0xBEEF);
+
+ token.mint(to, id);
+
+ token.burn(id);
+ token.burn(id);
+ }
+
+ function testFailApproveUnMinted(uint256 id, address to) public {
+ token.approve(to, id);
+ }
+
+ function testFailApproveUnAuthorized(address owner, uint256 id, address to) public {
+ if (owner == address(0) || owner == address(this)) owner = address(0xBEEF);
+
+ token.mint(owner, id);
+
+ token.approve(to, id);
+ }
+
+ function testFailTransferFromUnOwned(address from, address to, uint256 id) public {
+ token.transferFrom(from, to, id);
+ }
+
+ function testFailTransferFromWrongFrom(address owner, address from, address to, uint256 id) public {
+ if (owner == address(0)) to = address(0xBEEF);
+ if (from == owner) revert();
+
+ token.mint(owner, id);
+
+ token.transferFrom(from, to, id);
+ }
+
+ function testFailTransferFromToZero(uint256 id) public {
+ token.mint(address(this), id);
+
+ token.transferFrom(address(this), address(0), id);
+ }
+
+ function testFailTransferFromNotOwner(address from, address to, uint256 id) public {
+ if (from == address(this)) from = address(0xBEEF);
+
+ token.mint(from, id);
+
+ token.transferFrom(from, to, id);
+ }
+
+ function testFailSafeTransferFromToNonERC721Recipient(uint256 id) public {
+ token.mint(address(this), id);
+
+ token.safeTransferFrom(address(this), address(new NonERC721Recipient()), id);
+ }
+
+ function testFailSafeTransferFromToNonERC721RecipientWithData(uint256 id, bytes calldata data) public {
+ token.mint(address(this), id);
+
+ token.safeTransferFrom(address(this), address(new NonERC721Recipient()), id, data);
+ }
+
+ function testFailSafeTransferFromToRevertingERC721Recipient(uint256 id) public {
+ token.mint(address(this), id);
+
+ token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), id);
+ }
+
+ function testFailSafeTransferFromToRevertingERC721RecipientWithData(uint256 id, bytes calldata data) public {
+ token.mint(address(this), id);
+
+ token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), id, data);
+ }
+
+ function testFailSafeTransferFromToERC721RecipientWithWrongReturnData(uint256 id) public {
+ token.mint(address(this), id);
+
+ token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), id);
+ }
+
+ function testFailSafeTransferFromToERC721RecipientWithWrongReturnDataWithData(uint256 id, bytes calldata data)
+ public
+ {
+ token.mint(address(this), id);
+
+ token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), id, data);
+ }
+
+ function testFailSafeMintToNonERC721Recipient(uint256 id) public {
+ token.safeMint(address(new NonERC721Recipient()), id);
+ }
+
+ function testFailSafeMintToNonERC721RecipientWithData(uint256 id, bytes calldata data) public {
+ token.safeMint(address(new NonERC721Recipient()), id, data);
+ }
+
+ function testFailSafeMintToRevertingERC721Recipient(uint256 id) public {
+ token.safeMint(address(new RevertingERC721Recipient()), id);
+ }
+
+ function testFailSafeMintToRevertingERC721RecipientWithData(uint256 id, bytes calldata data) public {
+ token.safeMint(address(new RevertingERC721Recipient()), id, data);
+ }
+
+ function testFailSafeMintToERC721RecipientWithWrongReturnData(uint256 id) public {
+ token.safeMint(address(new WrongReturnDataERC721Recipient()), id);
+ }
+
+ function testFailSafeMintToERC721RecipientWithWrongReturnDataWithData(uint256 id, bytes calldata data) public {
+ token.safeMint(address(new WrongReturnDataERC721Recipient()), id, data);
+ }
+
+ function testFailOwnerOfUnminted(uint256 id) public view {
+ token.ownerOf(id);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/LICENSE b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/LICENSE
new file mode 100644
index 000000000..0ad25db4b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/LICENSE
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/README.md b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/README.md
new file mode 100644
index 000000000..3b6912fc3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/README.md
@@ -0,0 +1,100 @@
+# Halmos Cheat Codes
+
+Halmos cheatcodes are abstract functions designed to facilitate writing symbolic tests, such as the creation of new symbolic values at runtime. While these cheatcodes are currently exclusive to [Halmos][halmos], they are not limited to it and could potentially be supported by other symbolic testing tools in the future.
+
+Please refer to [the list of currently available cheatcodes][list]. More cheatcodes will be added in the future.
+
+Join the [Halmos Telegram Group][chat] for any inquiries or further discussions.
+
+[halmos]: https://github.com/a16z/halmos
+[list]: src/SVM.sol
+[chat]: https://t.me/+4UhzHduai3MzZmUx
+
+## Installation
+
+To install using Foundry:
+
+```
+forge install a16z/halmos-cheatcodes
+```
+
+Alternatively, you can directly add it as a submodule:
+
+```
+git submodule add https://github.com/a16z/halmos-cheatcodes
+```
+
+## Example usage
+
+Below is an example of a symbolic test that checks for potential unauthorized access to others' tokens. The approach involves setting up an initial symbolic state of the token contract, executing an arbitrary function call to the token contract, and checking if there is an execution path that increases the caller's balance and/or decreases the balance of others. This example illustrates how to utilize cheatcodes to set up initial symbolic states and execute arbitrary function calls.
+
+```solidity
+// import Halmos cheatcodes
+import { SymTest } from 'halmos-cheatcodes/SymTest.sol';
+
+import { Test } from 'forge-std/Test.sol';
+
+import { Token } from '/path/to/Token.sol';
+
+contract TokenTest is SymTest, Test {
+ Token token;
+
+ function setUp() public {
+ token = new Token();
+
+ // set the balances of three arbitrary accounts to arbitrary symbolic values
+ for (uint256 i = 0; i < 3; i++) {
+ address receiver = svm.createAddress('receiver'); // create a new symbolic address
+ uint256 amount = svm.createUint256('amount'); // create a new symbolic uint256 value
+ token.transfer(receiver, amount);
+ }
+ }
+
+ function checkBalanceUpdate() public {
+ // consider two arbitrary distinct accounts
+ address caller = svm.createAddress('caller'); // create a symbolic address
+ address others = svm.createAddress('others'); // create another symbolic address
+ vm.assume(others != caller); // assume the two addresses are different
+
+ // record their current balances
+ uint256 oldBalanceCaller = token.balanceOf(caller);
+ uint256 oldBalanceOthers = token.balanceOf(others);
+
+ // execute an arbitrary function call to the token from the caller
+ vm.prank(caller);
+ uint256 dataSize = 100; // the max calldata size for the public functions in the token
+ bytes memory data = svm.createBytes(dataSize, 'data'); // create a symbolic calldata
+ address(token).call(data);
+
+ // ensure that the caller cannot spend others' tokens
+ assert(token.balanceOf(caller) <= oldBalanceCaller); // cannot increase their own balance
+ assert(token.balanceOf(others) >= oldBalanceOthers); // cannot decrease others' balance
+ }
+}
+```
+
+When running the above test against the following buggy token contract, Halmos will provide a counterexample that may be overlooked during manual reviews.
+
+```solidity
+/// @notice This is a buggy token contract. DO NOT use it in production.
+contract Token {
+ mapping(address => uint) public balanceOf;
+
+ constructor() public {
+ balanceOf[msg.sender] = 1e27;
+ }
+
+ function transfer(address to, uint amount) public {
+ _transfer(msg.sender, to, amount);
+ }
+
+ function _transfer(address from, address to, uint amount) public {
+ balanceOf[from] -= amount;
+ balanceOf[to] += amount;
+ }
+}
+```
+
+## Disclaimer
+
+_These smart contracts and code are being provided as is. No guarantee, representation or warranty is being made, express or implied, as to the safety or correctness of the user interface or the smart contracts and code. They have not been audited and as such there can be no assurance they will work as intended, and users may experience delays, failures, errors, omissions or loss of transmitted information. THE SMART CONTRACTS AND CODE CONTAINED HEREIN ARE FURNISHED AS IS, WHERE IS, WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF MERCHANTABILITY, NON-INFRINGEMENT OR FITNESS FOR ANY PARTICULAR PURPOSE. Further, use of any of these smart contracts and code may be restricted or prohibited under applicable law, including securities laws, and it is therefore strongly advised for you to contact a reputable attorney in any jurisdiction where these smart contracts and code may be accessible for any questions or concerns with respect thereto. Further, no information provided in this repo should be construed as investment advice or legal advice for any particular facts or circumstances, and is not meant to replace competent counsel. a16z is not liable for any use of the foregoing, and users should proceed with caution and use at their own risk. See a16z.com/disclosures for more info._
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SVM.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SVM.sol
new file mode 100644
index 000000000..e9ba3ea04
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SVM.sol
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity >=0.8.0 <0.9.0;
+
+/// @notice Symbolic Virtual Machine
+interface SVM {
+ // Create a new symbolic uint value ranging over [0, 2**bitSize - 1] (inclusive)
+ function createUint(uint256 bitSize, string memory name) external pure returns (uint256 value);
+
+ // Create a new symbolic uint256 value
+ function createUint256(string memory name) external pure returns (uint256 value);
+
+ // Create a new symbolic signed int value
+ function createInt(uint256 bitSize, string memory name) external pure returns (int256 value);
+
+ // Create a new symbolic int256 value
+ function createInt256(string memory name) external pure returns (int256 value);
+
+ // Create a new symbolic byte array with the given byte size
+ function createBytes(uint256 byteSize, string memory name) external pure returns (bytes memory value);
+
+ // Create a new symbolic string backed by a symbolic array with the given byte size
+ function createString(uint256 byteSize, string memory name) external pure returns (string memory value);
+
+ // Create a new symbolic bytes32 value
+ function createBytes32(string memory name) external pure returns (bytes32 value);
+
+ // Create a new symbolic bytes4 value
+ function createBytes4(string memory name) external pure returns (bytes4 value);
+
+ // Create a new symbolic address value
+ function createAddress(string memory name) external pure returns (address value);
+
+ // Create a new symbolic boolean value
+ function createBool(string memory name) external pure returns (bool value);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SymTest.sol b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SymTest.sol
new file mode 100644
index 000000000..96684ed87
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SymTest.sol
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity >=0.8.0 <0.9.0;
+
+import {SVM} from "./SVM.sol";
+
+abstract contract SymTest {
+ // SVM cheat code address: 0xf3993a62377bcd56ae39d773740a5390411e8bc9
+ address internal constant SVM_ADDRESS = address(uint160(uint256(keccak256("svm cheat code"))));
+
+ SVM internal constant svm = SVM(SVM_ADDRESS);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/logo.svg b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/logo.svg
new file mode 100644
index 000000000..f1e14c2bb
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/logo.svg
@@ -0,0 +1,15 @@
+
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/netlify.toml b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/netlify.toml
new file mode 100644
index 000000000..0447f41ad
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/netlify.toml
@@ -0,0 +1,3 @@
+[build]
+command = "npm run docs"
+publish = "build/site"
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/package-lock.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/package-lock.json
new file mode 100644
index 000000000..6066b617f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/package-lock.json
@@ -0,0 +1,11419 @@
+{
+ "name": "openzeppelin-solidity",
+ "version": "5.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "openzeppelin-solidity",
+ "version": "5.1.0",
+ "license": "MIT",
+ "devDependencies": {
+ "@changesets/changelog-github": "^0.5.0",
+ "@changesets/cli": "^2.26.0",
+ "@changesets/pre": "^2.0.0",
+ "@changesets/read": "^0.6.0",
+ "@eslint/compat": "^1.2.1",
+ "@nomicfoundation/hardhat-chai-matchers": "^2.0.6",
+ "@nomicfoundation/hardhat-ethers": "^3.0.4",
+ "@nomicfoundation/hardhat-network-helpers": "^1.0.3",
+ "@openzeppelin/docs-utils": "^0.1.5",
+ "@openzeppelin/merkle-tree": "^1.0.7",
+ "@openzeppelin/upgrade-safe-transpiler": "^0.3.32",
+ "@openzeppelin/upgrades-core": "^1.20.6",
+ "chai": "^4.2.0",
+ "eslint": "^9.0.0",
+ "eslint-config-prettier": "^9.0.0",
+ "ethers": "^6.7.1",
+ "glob": "^11.0.0",
+ "globals": "^15.3.0",
+ "graphlib": "^2.1.8",
+ "hardhat": "^2.22.2",
+ "hardhat-exposed": "^0.3.15",
+ "hardhat-gas-reporter": "^2.0.0",
+ "hardhat-ignore-warnings": "^0.2.11",
+ "lodash.startcase": "^4.4.0",
+ "micromatch": "^4.0.2",
+ "p-limit": "^3.1.0",
+ "prettier": "^3.0.0",
+ "prettier-plugin-solidity": "^1.1.0",
+ "rimraf": "^6.0.0",
+ "semver": "^7.3.5",
+ "solhint": "^5.0.0",
+ "solhint-plugin-openzeppelin": "file:scripts/solhint-custom",
+ "solidity-ast": "^0.4.50",
+ "solidity-coverage": "^0.8.5",
+ "solidity-docgen": "^0.6.0-beta.29",
+ "undici": "^6.11.1",
+ "yargs": "^17.0.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@adraffy/ens-normalize": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz",
+ "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==",
+ "dev": true
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+ "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.22.13",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
+ "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz",
+ "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.4.tgz",
+ "integrity": "sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/config": "^2.3.1",
+ "@changesets/get-version-range-type": "^0.3.2",
+ "@changesets/git": "^2.0.0",
+ "@changesets/types": "^5.2.1",
+ "@manypkg/get-packages": "^1.1.3",
+ "detect-indent": "^6.0.0",
+ "fs-extra": "^7.0.1",
+ "lodash.startcase": "^4.4.0",
+ "outdent": "^0.5.0",
+ "prettier": "^2.7.1",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3"
+ }
+ },
+ "node_modules/@changesets/apply-release-plan/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/@changesets/assemble-release-plan": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.4.tgz",
+ "integrity": "sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/errors": "^0.1.4",
+ "@changesets/get-dependents-graph": "^1.3.6",
+ "@changesets/types": "^5.2.1",
+ "@manypkg/get-packages": "^1.1.3",
+ "semver": "^7.5.3"
+ }
+ },
+ "node_modules/@changesets/changelog-git": {
+ "version": "0.1.14",
+ "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz",
+ "integrity": "sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==",
+ "dev": true,
+ "dependencies": {
+ "@changesets/types": "^5.2.1"
+ }
+ },
+ "node_modules/@changesets/changelog-github": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.5.0.tgz",
+ "integrity": "sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==",
+ "dev": true,
+ "dependencies": {
+ "@changesets/get-github-info": "^0.6.0",
+ "@changesets/types": "^6.0.0",
+ "dotenv": "^8.1.0"
+ }
+ },
+ "node_modules/@changesets/changelog-github/node_modules/@changesets/types": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz",
+ "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==",
+ "dev": true
+ },
+ "node_modules/@changesets/cli": {
+ "version": "2.26.2",
+ "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.26.2.tgz",
+ "integrity": "sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/apply-release-plan": "^6.1.4",
+ "@changesets/assemble-release-plan": "^5.2.4",
+ "@changesets/changelog-git": "^0.1.14",
+ "@changesets/config": "^2.3.1",
+ "@changesets/errors": "^0.1.4",
+ "@changesets/get-dependents-graph": "^1.3.6",
+ "@changesets/get-release-plan": "^3.0.17",
+ "@changesets/git": "^2.0.0",
+ "@changesets/logger": "^0.0.5",
+ "@changesets/pre": "^1.0.14",
+ "@changesets/read": "^0.5.9",
+ "@changesets/types": "^5.2.1",
+ "@changesets/write": "^0.2.3",
+ "@manypkg/get-packages": "^1.1.3",
+ "@types/is-ci": "^3.0.0",
+ "@types/semver": "^7.5.0",
+ "ansi-colors": "^4.1.3",
+ "chalk": "^2.1.0",
+ "enquirer": "^2.3.0",
+ "external-editor": "^3.1.0",
+ "fs-extra": "^7.0.1",
+ "human-id": "^1.0.2",
+ "is-ci": "^3.0.1",
+ "meow": "^6.0.0",
+ "outdent": "^0.5.0",
+ "p-limit": "^2.2.0",
+ "preferred-pm": "^3.0.0",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3",
+ "spawndamnit": "^2.0.0",
+ "term-size": "^2.1.0",
+ "tty-table": "^4.1.5"
+ },
+ "bin": {
+ "changeset": "bin.js"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/@changesets/pre": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.14.tgz",
+ "integrity": "sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/errors": "^0.1.4",
+ "@changesets/types": "^5.2.1",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/@changesets/read": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.5.9.tgz",
+ "integrity": "sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/git": "^2.0.0",
+ "@changesets/logger": "^0.0.5",
+ "@changesets/parse": "^0.3.16",
+ "@changesets/types": "^5.2.1",
+ "chalk": "^2.1.0",
+ "fs-extra": "^7.0.1",
+ "p-filter": "^2.1.0"
+ }
+ },
+ "node_modules/@changesets/cli/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@changesets/config": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.1.tgz",
+ "integrity": "sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w==",
+ "dev": true,
+ "dependencies": {
+ "@changesets/errors": "^0.1.4",
+ "@changesets/get-dependents-graph": "^1.3.6",
+ "@changesets/logger": "^0.0.5",
+ "@changesets/types": "^5.2.1",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1",
+ "micromatch": "^4.0.2"
+ }
+ },
+ "node_modules/@changesets/errors": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.1.4.tgz",
+ "integrity": "sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==",
+ "dev": true,
+ "dependencies": {
+ "extendable-error": "^0.1.5"
+ }
+ },
+ "node_modules/@changesets/get-dependents-graph": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.6.tgz",
+ "integrity": "sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q==",
+ "dev": true,
+ "dependencies": {
+ "@changesets/types": "^5.2.1",
+ "@manypkg/get-packages": "^1.1.3",
+ "chalk": "^2.1.0",
+ "fs-extra": "^7.0.1",
+ "semver": "^7.5.3"
+ }
+ },
+ "node_modules/@changesets/get-github-info": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.6.0.tgz",
+ "integrity": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==",
+ "dev": true,
+ "dependencies": {
+ "dataloader": "^1.4.0",
+ "node-fetch": "^2.5.0"
+ }
+ },
+ "node_modules/@changesets/get-release-plan": {
+ "version": "3.0.17",
+ "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.17.tgz",
+ "integrity": "sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/assemble-release-plan": "^5.2.4",
+ "@changesets/config": "^2.3.1",
+ "@changesets/pre": "^1.0.14",
+ "@changesets/read": "^0.5.9",
+ "@changesets/types": "^5.2.1",
+ "@manypkg/get-packages": "^1.1.3"
+ }
+ },
+ "node_modules/@changesets/get-release-plan/node_modules/@changesets/pre": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.14.tgz",
+ "integrity": "sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/errors": "^0.1.4",
+ "@changesets/types": "^5.2.1",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1"
+ }
+ },
+ "node_modules/@changesets/get-release-plan/node_modules/@changesets/read": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.5.9.tgz",
+ "integrity": "sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/git": "^2.0.0",
+ "@changesets/logger": "^0.0.5",
+ "@changesets/parse": "^0.3.16",
+ "@changesets/types": "^5.2.1",
+ "chalk": "^2.1.0",
+ "fs-extra": "^7.0.1",
+ "p-filter": "^2.1.0"
+ }
+ },
+ "node_modules/@changesets/get-version-range-type": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz",
+ "integrity": "sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==",
+ "dev": true
+ },
+ "node_modules/@changesets/git": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@changesets/git/-/git-2.0.0.tgz",
+ "integrity": "sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/errors": "^0.1.4",
+ "@changesets/types": "^5.2.1",
+ "@manypkg/get-packages": "^1.1.3",
+ "is-subdir": "^1.1.1",
+ "micromatch": "^4.0.2",
+ "spawndamnit": "^2.0.0"
+ }
+ },
+ "node_modules/@changesets/logger": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.0.5.tgz",
+ "integrity": "sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.1.0"
+ }
+ },
+ "node_modules/@changesets/parse": {
+ "version": "0.3.16",
+ "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.16.tgz",
+ "integrity": "sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==",
+ "dev": true,
+ "dependencies": {
+ "@changesets/types": "^5.2.1",
+ "js-yaml": "^3.13.1"
+ }
+ },
+ "node_modules/@changesets/pre": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.0.tgz",
+ "integrity": "sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/errors": "^0.2.0",
+ "@changesets/types": "^6.0.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "fs-extra": "^7.0.1"
+ }
+ },
+ "node_modules/@changesets/pre/node_modules/@changesets/errors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz",
+ "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==",
+ "dev": true,
+ "dependencies": {
+ "extendable-error": "^0.1.5"
+ }
+ },
+ "node_modules/@changesets/pre/node_modules/@changesets/types": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz",
+ "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==",
+ "dev": true
+ },
+ "node_modules/@changesets/read": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.0.tgz",
+ "integrity": "sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/git": "^3.0.0",
+ "@changesets/logger": "^0.1.0",
+ "@changesets/parse": "^0.4.0",
+ "@changesets/types": "^6.0.0",
+ "chalk": "^2.1.0",
+ "fs-extra": "^7.0.1",
+ "p-filter": "^2.1.0"
+ }
+ },
+ "node_modules/@changesets/read/node_modules/@changesets/errors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz",
+ "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==",
+ "dev": true,
+ "dependencies": {
+ "extendable-error": "^0.1.5"
+ }
+ },
+ "node_modules/@changesets/read/node_modules/@changesets/git": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.0.tgz",
+ "integrity": "sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/errors": "^0.2.0",
+ "@changesets/types": "^6.0.0",
+ "@manypkg/get-packages": "^1.1.3",
+ "is-subdir": "^1.1.1",
+ "micromatch": "^4.0.2",
+ "spawndamnit": "^2.0.0"
+ }
+ },
+ "node_modules/@changesets/read/node_modules/@changesets/logger": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.0.tgz",
+ "integrity": "sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.1.0"
+ }
+ },
+ "node_modules/@changesets/read/node_modules/@changesets/parse": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz",
+ "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==",
+ "dev": true,
+ "dependencies": {
+ "@changesets/types": "^6.0.0",
+ "js-yaml": "^3.13.1"
+ }
+ },
+ "node_modules/@changesets/read/node_modules/@changesets/types": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz",
+ "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==",
+ "dev": true
+ },
+ "node_modules/@changesets/types": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz",
+ "integrity": "sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==",
+ "dev": true
+ },
+ "node_modules/@changesets/write": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.2.3.tgz",
+ "integrity": "sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.1",
+ "@changesets/types": "^5.2.1",
+ "fs-extra": "^7.0.1",
+ "human-id": "^1.0.2",
+ "prettier": "^2.7.1"
+ }
+ },
+ "node_modules/@changesets/write/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz",
+ "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/compat": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.1.tgz",
+ "integrity": "sha512-JbHG2TWuCeNzh87fXo+/46Z1LEo9DBA9T188d0fZgGxAD+cNyS6sx9fdiyxjGPBMyQVRlCutTByZ6a5+YMkF7g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.10.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
+ "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.4",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
+ "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+ "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz",
+ "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
+ "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz",
+ "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@ethereumjs/rlp": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz",
+ "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==",
+ "dev": true,
+ "bin": {
+ "rlp": "bin/rlp"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethereumjs/util": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz",
+ "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/rlp": "^4.0.1",
+ "ethereum-cryptography": "^2.0.0",
+ "micro-ftch": "^0.3.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz",
+ "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "1.1.0",
+ "@noble/hashes": "1.3.1",
+ "@scure/bip32": "1.3.1",
+ "@scure/bip39": "1.2.1"
+ }
+ },
+ "node_modules/@ethersproject/abi": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz",
+ "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-provider": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz",
+ "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/networks": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/web": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-signer": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz",
+ "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/address": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz",
+ "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/base64": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz",
+ "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/bignumber": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz",
+ "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "bn.js": "^5.2.1"
+ }
+ },
+ "node_modules/@ethersproject/bignumber/node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "dev": true
+ },
+ "node_modules/@ethersproject/bytes": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz",
+ "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/constants": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz",
+ "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/hash": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz",
+ "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/keccak256": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz",
+ "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "js-sha3": "0.8.0"
+ }
+ },
+ "node_modules/@ethersproject/logger": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz",
+ "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ]
+ },
+ "node_modules/@ethersproject/networks": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz",
+ "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/properties": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz",
+ "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/rlp": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz",
+ "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/signing-key": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz",
+ "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "bn.js": "^5.2.1",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "node_modules/@ethersproject/signing-key/node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "dev": true
+ },
+ "node_modules/@ethersproject/strings": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz",
+ "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/transactions": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz",
+ "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/units": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz",
+ "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/web": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz",
+ "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@fastify/busboy": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz",
+ "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@frangio/servbot": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/@frangio/servbot/-/servbot-0.2.5.tgz",
+ "integrity": "sha512-ogja4iAPZ1VwM5MU3C1ZhB88358F0PGbmSTGOkIZwOyLaDoMHIqOVCnavHjR7DV5h+oAI4Z4KDqlam3myQUrmg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.x",
+ "pnpm": "7.5.1"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz",
+ "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.5",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz",
+ "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.0",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@manypkg/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "@types/node": "^12.7.1",
+ "find-up": "^4.1.0",
+ "fs-extra": "^8.1.0"
+ }
+ },
+ "node_modules/@manypkg/find-root/node_modules/@types/node": {
+ "version": "12.20.55",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
+ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
+ "dev": true
+ },
+ "node_modules/@manypkg/find-root/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@manypkg/get-packages": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz",
+ "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "@changesets/types": "^4.0.1",
+ "@manypkg/find-root": "^1.1.0",
+ "fs-extra": "^8.1.0",
+ "globby": "^11.0.0",
+ "read-yaml-file": "^1.1.0"
+ }
+ },
+ "node_modules/@manypkg/get-packages/node_modules/@changesets/types": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz",
+ "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==",
+ "dev": true
+ },
+ "node_modules/@manypkg/get-packages/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@metamask/eth-sig-util": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz",
+ "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==",
+ "dev": true,
+ "dependencies": {
+ "ethereumjs-abi": "^0.6.8",
+ "ethereumjs-util": "^6.2.1",
+ "ethjs-util": "^0.1.6",
+ "tweetnacl": "^1.0.3",
+ "tweetnacl-util": "^0.15.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "dev": true,
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "node_modules/@noble/curves": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz",
+ "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "1.3.1"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz",
+ "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@noble/secp256k1": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz",
+ "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nomicfoundation/edr": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.3.3.tgz",
+ "integrity": "sha512-zP+e+3B1nEUx6bW5BPnIzCQbkhmYfdMBJdiVggTqqTfAA82sOkdOG7wsOMcz5qF3fYfx/irNRM1kgc9HVFIbpQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ },
+ "optionalDependencies": {
+ "@nomicfoundation/edr-darwin-arm64": "0.3.3",
+ "@nomicfoundation/edr-darwin-x64": "0.3.3",
+ "@nomicfoundation/edr-linux-arm64-gnu": "0.3.3",
+ "@nomicfoundation/edr-linux-arm64-musl": "0.3.3",
+ "@nomicfoundation/edr-linux-x64-gnu": "0.3.3",
+ "@nomicfoundation/edr-linux-x64-musl": "0.3.3",
+ "@nomicfoundation/edr-win32-arm64-msvc": "0.3.3",
+ "@nomicfoundation/edr-win32-ia32-msvc": "0.3.3",
+ "@nomicfoundation/edr-win32-x64-msvc": "0.3.3"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-darwin-arm64": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.3.tgz",
+ "integrity": "sha512-E9VGsUD+1Ga4mn/5ooHsMi8JEfhZbKP6CXN/BhJ8kXbIC10NqTD1RuhCKGRtYq4vqH/3Nfq25Xg8E8RWOF4KBQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-darwin-x64": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.3.tgz",
+ "integrity": "sha512-vkZXZ1ydPg+Ijb2iyqENA+KCkxGTCUWG5itCSliiA0Li2YE7ujDMGhheEpFp1WVlZadviz0bfk1rZXbCqlirpg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-linux-arm64-gnu": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.3.tgz",
+ "integrity": "sha512-gdIg0Yj1qqS9wVuywc5B/+DqKylfUGB6/CQn/shMqwAfsAVAVpchkhy66PR+REEx7fh/GkNctxLlENXPeLzDiA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-linux-arm64-musl": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.3.tgz",
+ "integrity": "sha512-AXZ08MFvhNeBZbOBNmz1SJ/DMrMOE2mHEJtaNnsctlxIunjxfrWww4q+WXB34jbr9iaVYYlPsaWe5sueuw6s3Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-linux-x64-gnu": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.3.tgz",
+ "integrity": "sha512-xElOs1U+E6lBLtv1mnJ+E8nr2MxZgKiLo8bZAgBboy9odYtmkDVwhMjtsFKSuZbGxFtsSyGRT4cXw3JAbtUDeA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-linux-x64-musl": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.3.tgz",
+ "integrity": "sha512-2Fe6gwm1RAGQ/PfMYiaSba2OrFp8zzYWh+am9lYObOFjV9D+A1zhIzfy0UC74glPks5eV8eY4pBPrVR042m2Nw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-win32-arm64-msvc": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.3.tgz",
+ "integrity": "sha512-8NHyxIsFrl0ufSQ/ErqF2lKIa/gz1gaaa1a2vKkDEqvqCUcPhBTYhA5NHgTPhLETFTnCFr0z+YbctFCyjh4qrA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-win32-ia32-msvc": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.3.3.tgz",
+ "integrity": "sha512-0F6hM0kGia4dQVb/kauho9JcP1ozWisY2/She+ISR5ceuhzmAwQJluM0g+0TYDME0LtxBxiMPq/yPiZMQeq31w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-win32-x64-msvc": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.3.tgz",
+ "integrity": "sha512-d75q1uaMb6z9i+GQZoblbOfFBvlBnWc+5rB13UWRkCOJSnoYwyFWhGJx5GeM59gC7aIblc5VD9qOAhHuvM9N+w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/ethereumjs-common": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz",
+ "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/ethereumjs-util": "9.0.4"
+ }
+ },
+ "node_modules/@nomicfoundation/ethereumjs-rlp": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz",
+ "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==",
+ "dev": true,
+ "bin": {
+ "rlp": "bin/rlp.cjs"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@nomicfoundation/ethereumjs-tx": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz",
+ "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/ethereumjs-common": "4.0.4",
+ "@nomicfoundation/ethereumjs-rlp": "5.0.4",
+ "@nomicfoundation/ethereumjs-util": "9.0.4",
+ "ethereum-cryptography": "0.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "c-kzg": "^2.1.2"
+ },
+ "peerDependenciesMeta": {
+ "c-kzg": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nomicfoundation/ethereumjs-util": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz",
+ "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/ethereumjs-rlp": "5.0.4",
+ "ethereum-cryptography": "0.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "c-kzg": "^2.1.2"
+ },
+ "peerDependenciesMeta": {
+ "c-kzg": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nomicfoundation/hardhat-chai-matchers": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.6.tgz",
+ "integrity": "sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai-as-promised": "^7.1.3",
+ "chai-as-promised": "^7.1.1",
+ "deep-eql": "^4.0.1",
+ "ordinal": "^1.0.3"
+ },
+ "peerDependencies": {
+ "@nomicfoundation/hardhat-ethers": "^3.0.0",
+ "chai": "^4.2.0",
+ "ethers": "^6.1.0",
+ "hardhat": "^2.9.4"
+ }
+ },
+ "node_modules/@nomicfoundation/hardhat-ethers": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz",
+ "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "lodash.isequal": "^4.5.0"
+ },
+ "peerDependencies": {
+ "ethers": "^6.1.0",
+ "hardhat": "^2.0.0"
+ }
+ },
+ "node_modules/@nomicfoundation/hardhat-network-helpers": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz",
+ "integrity": "sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==",
+ "dev": true,
+ "dependencies": {
+ "ethereumjs-util": "^7.1.4"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.9.5"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz",
+ "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ },
+ "optionalDependencies": {
+ "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1",
+ "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz",
+ "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz",
+ "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz",
+ "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz",
+ "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz",
+ "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz",
+ "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz",
+ "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz",
+ "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz",
+ "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz",
+ "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@openzeppelin/docs-utils": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.5.tgz",
+ "integrity": "sha512-GfqXArKmdq8rv+hsP+g8uS1VEkvMIzWs31dCONffzmqFwJ+MOsaNQNZNXQnLRgUkzk8i5mTNDjJuxDy+aBZImQ==",
+ "dev": true,
+ "dependencies": {
+ "@frangio/servbot": "^0.2.5",
+ "chalk": "^3.0.0",
+ "chokidar": "^3.5.3",
+ "env-paths": "^2.2.0",
+ "find-up": "^4.1.0",
+ "is-port-reachable": "^3.0.0",
+ "js-yaml": "^3.13.1",
+ "lodash.startcase": "^4.4.0",
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "oz-docs": "oz-docs.js"
+ }
+ },
+ "node_modules/@openzeppelin/docs-utils/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@openzeppelin/docs-utils/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@openzeppelin/docs-utils/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@openzeppelin/docs-utils/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@openzeppelin/docs-utils/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@openzeppelin/docs-utils/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@openzeppelin/merkle-tree": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/merkle-tree/-/merkle-tree-1.0.7.tgz",
+ "integrity": "sha512-i93t0YYv6ZxTCYU3CdO5Q+DXK0JH10A4dCBOMlzYbX+ujTXm+k1lXiEyVqmf94t3sqmv8sm/XT5zTa0+efnPgQ==",
+ "dev": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0"
+ }
+ },
+ "node_modules/@openzeppelin/upgrade-safe-transpiler": {
+ "version": "0.3.32",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/upgrade-safe-transpiler/-/upgrade-safe-transpiler-0.3.32.tgz",
+ "integrity": "sha512-ypgj6MXXcDG0dOuMwENXt0H4atCtCsPgpDgWZYewb2egfUCMpj6d2GO4pcNZgdn1zYsmUHfm5ZA/Nga/8qkdKA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0",
+ "compare-versions": "^6.0.0",
+ "ethereum-cryptography": "^2.0.0",
+ "lodash": "^4.17.20",
+ "minimatch": "^9.0.0",
+ "minimist": "^1.2.5",
+ "solidity-ast": "^0.4.51"
+ },
+ "bin": {
+ "upgrade-safe-transpiler": "dist/cli.js"
+ }
+ },
+ "node_modules/@openzeppelin/upgrade-safe-transpiler/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@openzeppelin/upgrade-safe-transpiler/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@openzeppelin/upgrade-safe-transpiler/node_modules/ethereum-cryptography": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz",
+ "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "1.1.0",
+ "@noble/hashes": "1.3.1",
+ "@scure/bip32": "1.3.1",
+ "@scure/bip39": "1.2.1"
+ }
+ },
+ "node_modules/@openzeppelin/upgrade-safe-transpiler/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/@openzeppelin/upgrade-safe-transpiler/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@openzeppelin/upgrade-safe-transpiler/node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.29.0.tgz",
+ "integrity": "sha512-csZvAMNqUJjMDNBPbaXcV9Nlo4oagMD/HkOBHTpYbBTpnmUhwPVHOMv+Rl0RatBdLHuGc6hw88h80k5PWkEeWw==",
+ "dev": true,
+ "dependencies": {
+ "cbor": "^9.0.0",
+ "chalk": "^4.1.0",
+ "compare-versions": "^6.0.0",
+ "debug": "^4.1.1",
+ "ethereumjs-util": "^7.0.3",
+ "minimist": "^1.2.7",
+ "proper-lockfile": "^4.1.1",
+ "solidity-ast": "^0.4.26"
+ },
+ "bin": {
+ "openzeppelin-upgrades-core": "dist/cli/cli.js"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pnpm/config.env-replace": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
+ "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
+ "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "4.2.10"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "node_modules/@pnpm/npm-conf": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz",
+ "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==",
+ "dev": true,
+ "dependencies": {
+ "@pnpm/config.env-replace": "^1.1.0",
+ "@pnpm/network.ca-file": "^1.0.1",
+ "config-chain": "^1.1.11"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@scure/base": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz",
+ "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==",
+ "dev": true,
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip32": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz",
+ "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "~1.1.0",
+ "@noble/hashes": "~1.3.1",
+ "@scure/base": "~1.1.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip39": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
+ "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "~1.3.0",
+ "@scure/base": "~1.1.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@sentry/core": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz",
+ "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/hub": "5.30.0",
+ "@sentry/minimal": "5.30.0",
+ "@sentry/types": "5.30.0",
+ "@sentry/utils": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/hub": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz",
+ "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/types": "5.30.0",
+ "@sentry/utils": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/minimal": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz",
+ "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/hub": "5.30.0",
+ "@sentry/types": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/node": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz",
+ "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/core": "5.30.0",
+ "@sentry/hub": "5.30.0",
+ "@sentry/tracing": "5.30.0",
+ "@sentry/types": "5.30.0",
+ "@sentry/utils": "5.30.0",
+ "cookie": "^0.4.1",
+ "https-proxy-agent": "^5.0.0",
+ "lru_map": "^0.3.3",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/tracing": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz",
+ "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/hub": "5.30.0",
+ "@sentry/minimal": "5.30.0",
+ "@sentry/types": "5.30.0",
+ "@sentry/utils": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/types": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz",
+ "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/utils": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz",
+ "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/types": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz",
+ "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@solidity-parser/parser": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz",
+ "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==",
+ "dev": true
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+ "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+ "dev": true,
+ "dependencies": {
+ "defer-to-connect": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@types/bn.js": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz",
+ "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz",
+ "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==",
+ "dev": true
+ },
+ "node_modules/@types/chai-as-promised": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz",
+ "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
+ "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
+ "dev": true
+ },
+ "node_modules/@types/is-ci": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/is-ci/-/is-ci-3.0.0.tgz",
+ "integrity": "sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==",
+ "dev": true,
+ "dependencies": {
+ "ci-info": "^3.1.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==",
+ "dev": true
+ },
+ "node_modules/@types/minimatch": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
+ "dev": true
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.9.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz",
+ "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+ "dev": true
+ },
+ "node_modules/@types/pbkdf2": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
+ "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/secp256k1": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz",
+ "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz",
+ "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==",
+ "dev": true
+ },
+ "node_modules/abbrev": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+ "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==",
+ "dev": true
+ },
+ "node_modules/abitype": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz",
+ "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/wevm"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.4",
+ "zod": "^3 >=3.22.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz",
+ "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/adm-zip": {
+ "version": "0.4.16",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz",
+ "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.4.2"
+ }
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.1.0"
+ }
+ },
+ "node_modules/ansi-align/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-align/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/antlr4": {
+ "version": "4.13.1",
+ "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.1.tgz",
+ "integrity": "sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/antlr4ts": {
+ "version": "0.5.0-alpha.4",
+ "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz",
+ "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz",
+ "integrity": "sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
+ "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ast-parents": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz",
+ "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==",
+ "dev": true
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
+ "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
+ "dev": true,
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base-x": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
+ "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/better-path-resolve": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz",
+ "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==",
+ "dev": true,
+ "dependencies": {
+ "is-windows": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/blakejs": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
+ "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==",
+ "dev": true
+ },
+ "node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/boxen": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
+ "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-align": "^3.0.0",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.1.0",
+ "cli-boxes": "^2.2.1",
+ "string-width": "^4.2.2",
+ "type-fest": "^0.20.2",
+ "widest-line": "^3.1.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/boxen/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/boxen/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/boxen/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/boxen/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boxen/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boxen/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boxen/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/breakword": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/breakword/-/breakword-1.0.6.tgz",
+ "integrity": "sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==",
+ "dev": true,
+ "dependencies": {
+ "wcwidth": "^1.0.1"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "dev": true
+ },
+ "node_modules/brotli-wasm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-2.0.1.tgz",
+ "integrity": "sha512-+3USgYsC7bzb5yU0/p2HnnynZl0ak0E6uoIm4UW4Aby/8s8HFCq6NCfrrf1E9c3O8OCSzq3oYO1tUVqIi61Nww==",
+ "dev": true
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+ "dev": true,
+ "dependencies": {
+ "base-x": "^3.0.2"
+ }
+ },
+ "node_modules/bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "dev": true,
+ "dependencies": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+ "dev": true
+ },
+ "node_modules/bufferutil": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
+ "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=6.14.2"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+ "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "10.2.14",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz",
+ "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-cache-semantics": "^4.0.2",
+ "get-stream": "^6.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "keyv": "^4.5.3",
+ "mimic-response": "^4.0.0",
+ "normalize-url": "^8.0.0",
+ "responselike": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cbor": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz",
+ "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==",
+ "dev": true,
+ "dependencies": {
+ "nofilter": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/chai": {
+ "version": "4.3.8",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz",
+ "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^4.1.2",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chai-as-promised": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
+ "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
+ "dev": true,
+ "dependencies": {
+ "check-error": "^1.0.2"
+ },
+ "peerDependencies": {
+ "chai": ">= 2.1.2 < 5"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "node_modules/charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
+ "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/command-exists": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
+ "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/compare-versions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz",
+ "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cosmiconfig/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/cosmiconfig/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/csv": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz",
+ "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==",
+ "dev": true,
+ "dependencies": {
+ "csv-generate": "^3.4.3",
+ "csv-parse": "^4.16.3",
+ "csv-stringify": "^5.6.5",
+ "stream-transform": "^2.1.3"
+ },
+ "engines": {
+ "node": ">= 0.1.90"
+ }
+ },
+ "node_modules/csv-generate": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz",
+ "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==",
+ "dev": true
+ },
+ "node_modules/csv-parse": {
+ "version": "4.16.3",
+ "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz",
+ "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==",
+ "dev": true
+ },
+ "node_modules/csv-stringify": {
+ "version": "5.6.5",
+ "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz",
+ "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==",
+ "dev": true
+ },
+ "node_modules/dataloader": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz",
+ "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==",
+ "dev": true
+ },
+ "node_modules/death": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz",
+ "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+ "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+ "dev": true,
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
+ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-port": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz",
+ "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==",
+ "dev": true,
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "4"
+ },
+ "bin": {
+ "detect": "bin/detect-port.js",
+ "detect-port": "bin/detect-port.js"
+ }
+ },
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/difflib": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz",
+ "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==",
+ "dev": true,
+ "dependencies": {
+ "heap": ">= 0.2.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
+ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz",
+ "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.2",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.1",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.12",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "safe-array-concat": "^1.0.1",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.8",
+ "string.prototype.trimend": "^1.0.7",
+ "string.prototype.trimstart": "^1.0.7",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+ "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==",
+ "dev": true,
+ "dependencies": {
+ "esprima": "^2.7.1",
+ "estraverse": "^1.9.1",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=0.12.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.2.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/estraverse": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+ "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
+ "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.11.0",
+ "@eslint/config-array": "^0.18.0",
+ "@eslint/core": "^0.7.0",
+ "@eslint/eslintrc": "^3.1.0",
+ "@eslint/js": "9.13.0",
+ "@eslint/plugin-kit": "^0.2.0",
+ "@humanfs/node": "^0.16.5",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.3.1",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.1.0",
+ "eslint-visitor-keys": "^4.1.0",
+ "espree": "^10.2.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz",
+ "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz",
+ "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
+ "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz",
+ "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.12.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
+ "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ethereum-bloom-filters": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz",
+ "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==",
+ "dev": true,
+ "dependencies": {
+ "js-sha3": "^0.8.0"
+ }
+ },
+ "node_modules/ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/ethereumjs-abi": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz",
+ "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.11.8",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "node_modules/ethereumjs-abi/node_modules/@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "dev": true,
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "node_modules/ethereumjs-util": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
+ "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==",
+ "dev": true,
+ "dependencies": {
+ "@types/bn.js": "^5.1.0",
+ "bn.js": "^5.1.2",
+ "create-hash": "^1.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "rlp": "^2.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/ethereumjs-util/node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "dev": true
+ },
+ "node_modules/ethers": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz",
+ "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/ethers-io/"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@adraffy/ens-normalize": "1.9.2",
+ "@noble/hashes": "1.1.2",
+ "@noble/secp256k1": "1.7.1",
+ "@types/node": "18.15.13",
+ "aes-js": "4.0.0-beta.5",
+ "tslib": "2.4.0",
+ "ws": "8.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/ethers/node_modules/@noble/hashes": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz",
+ "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/ethers/node_modules/@types/node": {
+ "version": "18.15.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz",
+ "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==",
+ "dev": true
+ },
+ "node_modules/ethers/node_modules/aes-js": {
+ "version": "4.0.0-beta.5",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz",
+ "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==",
+ "dev": true
+ },
+ "node_modules/ethers/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
+ "dev": true
+ },
+ "node_modules/ethers/node_modules/ws": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
+ "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ethjs-unit": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
+ "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "4.11.6",
+ "number-to-bn": "1.7.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/ethjs-unit/node_modules/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
+ "dev": true
+ },
+ "node_modules/ethjs-util": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
+ "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
+ "dev": true,
+ "dependencies": {
+ "is-hex-prefixed": "1.0.0",
+ "strip-hex-prefix": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/extendable-error": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz",
+ "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==",
+ "dev": true
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-yarn-workspace-root2": {
+ "version": "1.2.16",
+ "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz",
+ "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==",
+ "dev": true,
+ "dependencies": {
+ "micromatch": "^4.0.2",
+ "pkg-dir": "^4.2.0"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data-encoder": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+ "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.17"
+ }
+ },
+ "node_modules/fp-ts": {
+ "version": "1.19.3",
+ "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz",
+ "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==",
+ "dev": true
+ },
+ "node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ghost-testrpc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz",
+ "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "node-emoji": "^1.10.0"
+ },
+ "bin": {
+ "testrpc-sc": "index.js"
+ }
+ },
+ "node_modules/glob": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
+ "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^4.0.1",
+ "minimatch": "^10.0.0",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
+ "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "15.11.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz",
+ "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/got": {
+ "version": "12.6.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
+ "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/is": "^5.2.0",
+ "@szmarczak/http-timer": "^5.0.1",
+ "cacheable-lookup": "^7.0.0",
+ "cacheable-request": "^10.2.8",
+ "decompress-response": "^6.0.0",
+ "form-data-encoder": "^2.1.2",
+ "get-stream": "^6.0.1",
+ "http2-wrapper": "^2.1.10",
+ "lowercase-keys": "^3.0.0",
+ "p-cancelable": "^3.0.0",
+ "responselike": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "node_modules/graphlib": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
+ "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/handlebars/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/hardhat": {
+ "version": "2.22.2",
+ "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.2.tgz",
+ "integrity": "sha512-0xZ7MdCZ5sJem4MrvpQWLR3R3zGDoHw5lsR+pBFimqwagimIOn3bWuZv69KA+veXClwI1s/zpqgwPwiFrd4Dxw==",
+ "dev": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.1.2",
+ "@metamask/eth-sig-util": "^4.0.0",
+ "@nomicfoundation/edr": "^0.3.1",
+ "@nomicfoundation/ethereumjs-common": "4.0.4",
+ "@nomicfoundation/ethereumjs-tx": "5.0.4",
+ "@nomicfoundation/ethereumjs-util": "9.0.4",
+ "@nomicfoundation/solidity-analyzer": "^0.1.0",
+ "@sentry/node": "^5.18.1",
+ "@types/bn.js": "^5.1.0",
+ "@types/lru-cache": "^5.1.0",
+ "adm-zip": "^0.4.16",
+ "aggregate-error": "^3.0.0",
+ "ansi-escapes": "^4.3.0",
+ "boxen": "^5.1.2",
+ "chalk": "^2.4.2",
+ "chokidar": "^3.4.0",
+ "ci-info": "^2.0.0",
+ "debug": "^4.1.1",
+ "enquirer": "^2.3.0",
+ "env-paths": "^2.2.0",
+ "ethereum-cryptography": "^1.0.3",
+ "ethereumjs-abi": "^0.6.8",
+ "find-up": "^2.1.0",
+ "fp-ts": "1.19.3",
+ "fs-extra": "^7.0.1",
+ "glob": "7.2.0",
+ "immutable": "^4.0.0-rc.12",
+ "io-ts": "1.10.4",
+ "keccak": "^3.0.2",
+ "lodash": "^4.17.11",
+ "mnemonist": "^0.38.0",
+ "mocha": "^10.0.0",
+ "p-map": "^4.0.0",
+ "raw-body": "^2.4.1",
+ "resolve": "1.17.0",
+ "semver": "^6.3.0",
+ "solc": "0.7.3",
+ "source-map-support": "^0.5.13",
+ "stacktrace-parser": "^0.1.10",
+ "tsort": "0.0.1",
+ "undici": "^5.14.0",
+ "uuid": "^8.3.2",
+ "ws": "^7.4.6"
+ },
+ "bin": {
+ "hardhat": "internal/cli/bootstrap.js"
+ },
+ "peerDependencies": {
+ "ts-node": "*",
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/hardhat-exposed": {
+ "version": "0.3.15",
+ "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.15.tgz",
+ "integrity": "sha512-jqxErCnSWGYf4vAkLmh3H3u+IuLuCLw/EVeV13z1JKJMJAd/iO+G283n8T124S/Q2BF/BoA2zgzYAlqXgNyKew==",
+ "dev": true,
+ "dependencies": {
+ "micromatch": "^4.0.4",
+ "solidity-ast": "^0.4.52"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.3.0"
+ }
+ },
+ "node_modules/hardhat-gas-reporter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-2.1.0.tgz",
+ "integrity": "sha512-d/WU/qHhBFnbweAm2fAAjcaaE0M7BKZ4r+/bqcFlfP6um28BXtlv2FrJ6oyQUGSFD0ttbmB7sH4ZFDzkYw5GzA==",
+ "dev": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/units": "^5.7.0",
+ "@solidity-parser/parser": "^0.18.0",
+ "axios": "^1.6.7",
+ "brotli-wasm": "^2.0.1",
+ "chalk": "4.1.2",
+ "cli-table3": "^0.6.3",
+ "ethereum-cryptography": "^2.1.3",
+ "glob": "^10.3.10",
+ "jsonschema": "^1.4.1",
+ "lodash": "^4.17.21",
+ "markdown-table": "2.0.0",
+ "sha1": "^1.1.1",
+ "viem": "2.7.14"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.16.0"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/@noble/curves": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz",
+ "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "1.3.3"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/@noble/hashes": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz",
+ "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/@scure/bip32": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz",
+ "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "~1.3.0",
+ "@noble/hashes": "~1.3.2",
+ "@scure/base": "~1.1.4"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/@scure/bip39": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz",
+ "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "~1.3.2",
+ "@scure/base": "~1.1.4"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/cli-table3": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz",
+ "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/ethereum-cryptography": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz",
+ "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "1.3.0",
+ "@noble/hashes": "1.3.3",
+ "@scure/bip32": "1.3.3",
+ "@scure/bip39": "1.2.2"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/markdown-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
+ "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
+ "dev": true,
+ "dependencies": {
+ "repeat-string": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hardhat-gas-reporter/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hardhat-ignore-warnings": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.11.tgz",
+ "integrity": "sha512-+nHnRbP6COFZaXE7HAY7TZNE3au5vHe5dkcnyq0XaP07ikT2fJ3NhFY0vn7Deh4Qbz0Z/9Xpnj2ki6Ktgk61pg==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^5.1.0",
+ "node-interval-tree": "^2.0.1",
+ "solidity-comments": "^0.0.2"
+ }
+ },
+ "node_modules/hardhat-ignore-warnings/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/hardhat-ignore-warnings/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hardhat/node_modules/@noble/hashes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz",
+ "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/hardhat/node_modules/@scure/bip32": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz",
+ "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "@noble/hashes": "~1.2.0",
+ "@noble/secp256k1": "~1.7.0",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/@scure/bip39": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz",
+ "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "@noble/hashes": "~1.2.0",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "dev": true
+ },
+ "node_modules/hardhat/node_modules/commander": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
+ "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
+ "dev": true
+ },
+ "node_modules/hardhat/node_modules/ethereum-cryptography": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz",
+ "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "1.2.0",
+ "@noble/secp256k1": "1.7.1",
+ "@scure/bip32": "1.1.5",
+ "@scure/bip39": "1.1.1"
+ }
+ },
+ "node_modules/hardhat/node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/hardhat/node_modules/jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/hardhat/node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/hardhat/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/hardhat/node_modules/solc": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz",
+ "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==",
+ "dev": true,
+ "dependencies": {
+ "command-exists": "^1.2.8",
+ "commander": "3.0.2",
+ "follow-redirects": "^1.12.1",
+ "fs-extra": "^0.30.0",
+ "js-sha3": "0.8.0",
+ "memorystream": "^0.3.1",
+ "require-from-string": "^2.0.0",
+ "semver": "^5.5.0",
+ "tmp": "0.0.33"
+ },
+ "bin": {
+ "solcjs": "solcjs"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
+ "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "node_modules/hardhat/node_modules/solc/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/hardhat/node_modules/undici": {
+ "version": "5.28.4",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
+ "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
+ "dev": true,
+ "dependencies": {
+ "@fastify/busboy": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.0"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/heap": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz",
+ "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==",
+ "dev": true
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dev": true,
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "dev": true
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http2-wrapper": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
+ "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
+ "dev": true,
+ "dependencies": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ }
+ },
+ "node_modules/http2-wrapper/node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-id": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz",
+ "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==",
+ "dev": true
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz",
+ "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==",
+ "dev": true
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+ "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/io-ts": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz",
+ "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==",
+ "dev": true,
+ "dependencies": {
+ "fp-ts": "^1.0.0"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+ "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "dev": true,
+ "dependencies": {
+ "ci-info": "^3.2.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hex-prefixed": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
+ "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-port-reachable": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz",
+ "integrity": "sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-subdir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz",
+ "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==",
+ "dev": true,
+ "dependencies": {
+ "better-path-resolve": "1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isows": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz",
+ "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wagmi-dev"
+ }
+ ],
+ "peerDependencies": {
+ "ws": "*"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz",
+ "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonschema": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz",
+ "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/keccak": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz",
+ "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/latest-version": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
+ "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==",
+ "dev": true,
+ "dependencies": {
+ "package-json": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/load-yaml-file": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz",
+ "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.5",
+ "js-yaml": "^3.13.0",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-symbols/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/log-symbols/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-symbols/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "node_modules/lowercase-keys": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+ "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lru_map": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
+ "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz",
+ "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/memorystream": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/meow": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz",
+ "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "^4.0.2",
+ "normalize-package-data": "^2.5.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.13.1",
+ "yargs-parser": "^18.1.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/meow/node_modules/type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micro-ftch": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz",
+ "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==",
+ "dev": true
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+ "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mixme": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.9.tgz",
+ "integrity": "sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mnemonist": {
+ "version": "0.38.5",
+ "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz",
+ "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==",
+ "dev": true,
+ "dependencies": {
+ "obliterator": "^2.0.0"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
+ "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/mocha/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mocha/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mocha/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/mocha/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==",
+ "dev": true
+ },
+ "node_modules/node-emoji": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
+ "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz",
+ "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==",
+ "dev": true,
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/node-interval-tree": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.1.2.tgz",
+ "integrity": "sha512-bJ9zMDuNGzVQg1xv0bCPzyEDxHgbrx7/xGj6CDokvizZZmastPsOh0JJLuY8wA5q2SfX1TLNMk7XNV8WxbGxzA==",
+ "dev": true,
+ "dependencies": {
+ "shallowequal": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/nofilter": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz",
+ "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.19"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz",
+ "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/number-to-bn": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
+ "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "4.11.6",
+ "strip-hex-prefix": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/number-to-bn/node_modules/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
+ "dev": true
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obliterator": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
+ "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==",
+ "dev": true
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ordinal": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz",
+ "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==",
+ "dev": true
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/outdent": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz",
+ "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==",
+ "dev": true
+ },
+ "node_modules/p-cancelable": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/p-filter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz",
+ "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==",
+ "dev": true,
+ "dependencies": {
+ "p-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-filter/node_modules/p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz",
+ "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==",
+ "dev": true,
+ "dependencies": {
+ "got": "^12.1.0",
+ "registry-auth-token": "^5.0.1",
+ "registry-url": "^6.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-scurry": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
+ "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dev": true,
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/preferred-pm": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz",
+ "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^5.0.0",
+ "find-yarn-workspace-root2": "1.2.16",
+ "path-exists": "^4.0.0",
+ "which-pm": "2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/preferred-pm/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/preferred-pm/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/preferred-pm/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
+ "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-plugin-solidity": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz",
+ "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==",
+ "dev": true,
+ "dependencies": {
+ "@solidity-parser/parser": "^0.16.0",
+ "semver": "^7.3.8",
+ "solidity-comments-extractor": "^0.0.7"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "prettier": ">=2.3.0 || >=3.0.0-alpha.0"
+ }
+ },
+ "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz",
+ "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==",
+ "dev": true,
+ "dependencies": {
+ "antlr4ts": "^0.5.0-alpha.4"
+ }
+ },
+ "node_modules/proper-lockfile": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
+ "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "retry": "^0.12.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "dev": true
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "dev": true
+ },
+ "node_modules/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-yaml-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz",
+ "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.5",
+ "js-yaml": "^3.6.1",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.1.6"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/redent/node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
+ "dev": true
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
+ "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "set-function-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/registry-auth-token": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz",
+ "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==",
+ "dev": true,
+ "dependencies": {
+ "@pnpm/npm-conf": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/registry-url": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
+ "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
+ "dev": true,
+ "dependencies": {
+ "rc": "1.2.8"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "dev": true,
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "dev": true
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/responselike": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+ "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+ "dev": true,
+ "dependencies": {
+ "lowercase-keys": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.0.tgz",
+ "integrity": "sha512-u+yqhM92LW+89cxUQK0SRyvXYQmyuKHx0jkx4W7KfwLGLqJnQM5031Uv1trE4gB9XEXBM/s6MxKlfW95IidqaA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^11.0.0"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/rlp": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
+ "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^5.2.0"
+ },
+ "bin": {
+ "rlp": "bin/rlp"
+ }
+ },
+ "node_modules/rlp/node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "dev": true
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
+ "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/sc-istanbul": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz",
+ "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1.0.x",
+ "async": "1.x",
+ "escodegen": "1.8.x",
+ "esprima": "2.7.x",
+ "glob": "^5.0.15",
+ "handlebars": "^4.0.1",
+ "js-yaml": "3.x",
+ "mkdirp": "0.5.x",
+ "nopt": "3.x",
+ "once": "1.x",
+ "resolve": "1.1.x",
+ "supports-color": "^3.1.0",
+ "which": "^1.1.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "istanbul": "lib/cli.js"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
+ "dev": true,
+ "dependencies": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==",
+ "dev": true
+ },
+ "node_modules/sc-istanbul/node_modules/supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==",
+ "dev": true
+ },
+ "node_modules/secp256k1": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz",
+ "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "elliptic": "^6.5.7",
+ "node-addon-api": "^5.0.0",
+ "node-gyp-build": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/secp256k1/node_modules/elliptic": {
+ "version": "6.5.7",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz",
+ "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/secp256k1/node_modules/node-addon-api": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
+ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
+ "dev": true
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+ "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+ "dev": true
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/sha1": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
+ "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
+ "dev": true,
+ "dependencies": {
+ "charenc": ">= 0.0.1",
+ "crypt": ">= 0.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
+ "dev": true
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ },
+ "bin": {
+ "shjs": "bin/shjs"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/shelljs/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/smartwrap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz",
+ "integrity": "sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==",
+ "dev": true,
+ "dependencies": {
+ "array.prototype.flat": "^1.2.3",
+ "breakword": "^1.0.5",
+ "grapheme-splitter": "^1.0.4",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1",
+ "yargs": "^15.1.0"
+ },
+ "bin": {
+ "smartwrap": "src/terminal-adapter.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/smartwrap/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/smartwrap/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/smartwrap/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/smartwrap/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/smartwrap/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/smartwrap/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/smartwrap/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/smartwrap/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
+ },
+ "node_modules/smartwrap/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/solhint": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/solhint/-/solhint-5.0.0.tgz",
+ "integrity": "sha512-pSRKkzRsruia6/xa9L5VSyd7dMZkiiTi/aYZcvUQo7KK+S16ojPwIbt2jfjbH5WEJ83grzIIE4WrYQfAxGWh/A==",
+ "dev": true,
+ "dependencies": {
+ "@solidity-parser/parser": "^0.18.0",
+ "ajv": "^6.12.6",
+ "antlr4": "^4.13.1-patch-1",
+ "ast-parents": "^0.0.1",
+ "chalk": "^4.1.2",
+ "commander": "^10.0.0",
+ "cosmiconfig": "^8.0.0",
+ "fast-diff": "^1.2.0",
+ "glob": "^8.0.3",
+ "ignore": "^5.2.4",
+ "js-yaml": "^4.1.0",
+ "latest-version": "^7.0.0",
+ "lodash": "^4.17.21",
+ "pluralize": "^8.0.0",
+ "semver": "^7.5.2",
+ "strip-ansi": "^6.0.1",
+ "table": "^6.8.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "solhint": "solhint.js"
+ },
+ "optionalDependencies": {
+ "prettier": "^2.8.3"
+ }
+ },
+ "node_modules/solhint-plugin-openzeppelin": {
+ "resolved": "scripts/solhint-custom",
+ "link": true
+ },
+ "node_modules/solhint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/solhint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/solhint/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/solhint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/solhint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/solhint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/solhint/node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/solhint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/solhint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/solhint/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/solhint/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/solhint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/solidity-ast": {
+ "version": "0.4.52",
+ "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.52.tgz",
+ "integrity": "sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==",
+ "dev": true,
+ "dependencies": {
+ "array.prototype.findlast": "^1.2.2"
+ }
+ },
+ "node_modules/solidity-comments": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments/-/solidity-comments-0.0.2.tgz",
+ "integrity": "sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ },
+ "optionalDependencies": {
+ "solidity-comments-darwin-arm64": "0.0.2",
+ "solidity-comments-darwin-x64": "0.0.2",
+ "solidity-comments-freebsd-x64": "0.0.2",
+ "solidity-comments-linux-arm64-gnu": "0.0.2",
+ "solidity-comments-linux-arm64-musl": "0.0.2",
+ "solidity-comments-linux-x64-gnu": "0.0.2",
+ "solidity-comments-linux-x64-musl": "0.0.2",
+ "solidity-comments-win32-arm64-msvc": "0.0.2",
+ "solidity-comments-win32-ia32-msvc": "0.0.2",
+ "solidity-comments-win32-x64-msvc": "0.0.2"
+ }
+ },
+ "node_modules/solidity-comments-darwin-arm64": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz",
+ "integrity": "sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-darwin-x64": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz",
+ "integrity": "sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-extractor": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz",
+ "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==",
+ "dev": true
+ },
+ "node_modules/solidity-comments-freebsd-x64": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz",
+ "integrity": "sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-linux-arm64-gnu": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz",
+ "integrity": "sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-linux-arm64-musl": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz",
+ "integrity": "sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-linux-x64-gnu": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz",
+ "integrity": "sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-linux-x64-musl": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz",
+ "integrity": "sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-win32-arm64-msvc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz",
+ "integrity": "sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-win32-ia32-msvc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz",
+ "integrity": "sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-comments-win32-x64-msvc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz",
+ "integrity": "sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/solidity-coverage": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.5.tgz",
+ "integrity": "sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==",
+ "dev": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.0.9",
+ "@solidity-parser/parser": "^0.16.0",
+ "chalk": "^2.4.2",
+ "death": "^1.1.0",
+ "detect-port": "^1.3.0",
+ "difflib": "^0.2.4",
+ "fs-extra": "^8.1.0",
+ "ghost-testrpc": "^0.0.2",
+ "global-modules": "^2.0.0",
+ "globby": "^10.0.1",
+ "jsonschema": "^1.2.4",
+ "lodash": "^4.17.15",
+ "mocha": "10.2.0",
+ "node-emoji": "^1.10.0",
+ "pify": "^4.0.1",
+ "recursive-readdir": "^2.2.2",
+ "sc-istanbul": "^0.4.5",
+ "semver": "^7.3.4",
+ "shelljs": "^0.8.3",
+ "web3-utils": "^1.3.6"
+ },
+ "bin": {
+ "solidity-coverage": "plugins/bin.js"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.11.0"
+ }
+ },
+ "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz",
+ "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==",
+ "dev": true,
+ "dependencies": {
+ "antlr4ts": "^0.5.0-alpha.4"
+ }
+ },
+ "node_modules/solidity-coverage/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/solidity-coverage/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/solidity-coverage/node_modules/globby": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+ "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+ "dev": true,
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.0.3",
+ "glob": "^7.1.3",
+ "ignore": "^5.1.1",
+ "merge2": "^1.2.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/solidity-docgen": {
+ "version": "0.6.0-beta.36",
+ "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.36.tgz",
+ "integrity": "sha512-f/I5G2iJgU1h0XrrjRD0hHMr7C10u276vYvm//rw1TzFcYQ4xTOyAoi9oNAHRU0JU4mY9eTuxdVc2zahdMuhaQ==",
+ "dev": true,
+ "dependencies": {
+ "handlebars": "^4.7.7",
+ "solidity-ast": "^0.4.38"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.8.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+ "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "amdefine": ">=0.0.4"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spawndamnit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz",
+ "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/spawndamnit/node_modules/cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "node_modules/spawndamnit/node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/spawndamnit/node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spawndamnit/node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spawndamnit/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/spawndamnit/node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.15",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz",
+ "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==",
+ "dev": true
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/stacktrace-parser": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
+ "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.7.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stacktrace-parser/node_modules/type-fest": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
+ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/stream-transform": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz",
+ "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==",
+ "dev": true,
+ "dependencies": {
+ "mixme": "^0.5.1"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
+ "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
+ "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
+ "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-hex-prefix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
+ "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==",
+ "dev": true,
+ "dependencies": {
+ "is-hex-prefixed": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/table": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
+ "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/table/node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/table/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/term-size": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
+ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true
+ },
+ "node_modules/trim-newlines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node/node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tsort": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz",
+ "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==",
+ "dev": true
+ },
+ "node_modules/tty-table": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/tty-table/-/tty-table-4.2.1.tgz",
+ "integrity": "sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "csv": "^5.5.3",
+ "kleur": "^4.1.5",
+ "smartwrap": "^2.0.2",
+ "strip-ansi": "^6.0.1",
+ "wcwidth": "^1.0.1",
+ "yargs": "^17.7.1"
+ },
+ "bin": {
+ "tty-table": "adapters/terminal-adapter.js"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/tty-table/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/tty-table/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/tty-table/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/tty-table/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/tty-table/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tty-table/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
+ "dev": true
+ },
+ "node_modules/tweetnacl-util": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz",
+ "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
+ "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.17.4",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
+ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.12.0.tgz",
+ "integrity": "sha512-d87yk8lqSFUYtR5fTFe2frpkMIrUEz+lgoJmhcL+J3StVl+8fj8ytE4lLnJOTPCE12YbumNGzf4LYsQyusdV5g==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/utf-8-validate": {
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
+ "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=6.14.2"
+ }
+ },
+ "node_modules/utf8": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+ "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==",
+ "dev": true
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/viem": {
+ "version": "2.7.14",
+ "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.14.tgz",
+ "integrity": "sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wevm"
+ }
+ ],
+ "dependencies": {
+ "@adraffy/ens-normalize": "1.10.0",
+ "@noble/curves": "1.2.0",
+ "@noble/hashes": "1.3.2",
+ "@scure/bip32": "1.3.2",
+ "@scure/bip39": "1.2.1",
+ "abitype": "1.0.0",
+ "isows": "1.0.3",
+ "ws": "8.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/viem/node_modules/@adraffy/ens-normalize": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz",
+ "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==",
+ "dev": true
+ },
+ "node_modules/viem/node_modules/@noble/curves": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
+ "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "1.3.2"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/viem/node_modules/@noble/hashes": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
+ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/viem/node_modules/@scure/bip32": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz",
+ "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "~1.2.0",
+ "@noble/hashes": "~1.3.2",
+ "@scure/base": "~1.1.2"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/viem/node_modules/ws": {
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
+ "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/web3-utils": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz",
+ "integrity": "sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/util": "^8.1.0",
+ "bn.js": "^5.2.1",
+ "ethereum-bloom-filters": "^1.0.6",
+ "ethereum-cryptography": "^2.1.2",
+ "ethjs-unit": "0.1.6",
+ "number-to-bn": "1.7.0",
+ "randombytes": "^2.1.0",
+ "utf8": "3.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/web3-utils/node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "dev": true
+ },
+ "node_modules/web3-utils/node_modules/ethereum-cryptography": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz",
+ "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "1.1.0",
+ "@noble/hashes": "1.3.1",
+ "@scure/bip32": "1.3.1",
+ "@scure/bip39": "1.2.1"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+ "dev": true
+ },
+ "node_modules/which-pm": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz",
+ "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==",
+ "dev": true,
+ "dependencies": {
+ "load-yaml-file": "^0.2.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8.15"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
+ "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+ "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/widest-line/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/widest-line/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true
+ },
+ "node_modules/workerpool": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs-parser/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "scripts/solhint-custom": {
+ "name": "solhint-plugin-openzeppelin",
+ "version": "0.0.0",
+ "dev": true
+ }
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/package.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/package.json
new file mode 100644
index 000000000..4db5ac0a1
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/package.json
@@ -0,0 +1,92 @@
+{
+ "name": "openzeppelin-solidity",
+ "description": "Secure Smart Contract library for Solidity",
+ "version": "5.2.0",
+ "private": true,
+ "files": [
+ "/contracts/**/*.sol",
+ "!/contracts/mocks/**/*"
+ ],
+ "scripts": {
+ "compile": "hardhat compile",
+ "compile:harnesses": "env SRC=./certora/harnesses hardhat compile",
+ "coverage": "scripts/checks/coverage.sh",
+ "docs": "npm run prepare-docs && oz-docs",
+ "docs:watch": "oz-docs watch contracts docs/templates docs/config.js",
+ "prepare": "scripts/prepare.sh",
+ "prepare-docs": "scripts/prepare-docs.sh",
+ "lint": "npm run lint:js && npm run lint:sol",
+ "lint:fix": "npm run lint:js:fix && npm run lint:sol:fix",
+ "lint:js": "prettier --log-level warn --ignore-path .gitignore '**/*.{js,ts}' --check && eslint .",
+ "lint:js:fix": "prettier --log-level warn --ignore-path .gitignore '**/*.{js,ts}' --write && eslint . --fix",
+ "lint:sol": "prettier --log-level warn --ignore-path .gitignore '{contracts,test}/**/*.sol' --check && solhint '{contracts,test}/**/*.sol'",
+ "lint:sol:fix": "prettier --log-level warn --ignore-path .gitignore '{contracts,test}/**/*.sol' --write",
+ "clean": "hardhat clean && rimraf build contracts/build",
+ "prepack": "scripts/prepack.sh",
+ "generate": "scripts/generate/run.js",
+ "version": "scripts/release/version.sh",
+ "test": "hardhat test",
+ "test:generation": "scripts/checks/generation.sh",
+ "test:inheritance": "scripts/checks/inheritance-ordering.js artifacts/build-info/*",
+ "test:pragma": "scripts/checks/pragma-consistency.js artifacts/build-info/*",
+ "gas-report": "env ENABLE_GAS_REPORT=true npm run test",
+ "slither": "npm run clean && slither ."
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/OpenZeppelin/openzeppelin-contracts.git"
+ },
+ "keywords": [
+ "solidity",
+ "ethereum",
+ "smart",
+ "contracts",
+ "security",
+ "zeppelin"
+ ],
+ "author": "OpenZeppelin Community ",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/OpenZeppelin/openzeppelin-contracts/issues"
+ },
+ "homepage": "https://openzeppelin.com/contracts/",
+ "devDependencies": {
+ "@changesets/changelog-github": "^0.5.0",
+ "@changesets/cli": "^2.26.0",
+ "@changesets/pre": "^2.0.0",
+ "@changesets/read": "^0.6.0",
+ "@eslint/compat": "^1.2.1",
+ "@nomicfoundation/hardhat-chai-matchers": "^2.0.6",
+ "@nomicfoundation/hardhat-ethers": "^3.0.4",
+ "@nomicfoundation/hardhat-network-helpers": "^1.0.3",
+ "@openzeppelin/docs-utils": "^0.1.5",
+ "@openzeppelin/merkle-tree": "^1.0.7",
+ "@openzeppelin/upgrade-safe-transpiler": "^0.3.32",
+ "@openzeppelin/upgrades-core": "^1.20.6",
+ "chai": "^4.2.0",
+ "eslint": "^9.0.0",
+ "eslint-config-prettier": "^9.0.0",
+ "ethers": "^6.7.1",
+ "globals": "^15.3.0",
+ "glob": "^11.0.0",
+ "graphlib": "^2.1.8",
+ "hardhat": "^2.22.2",
+ "hardhat-exposed": "^0.3.15",
+ "hardhat-gas-reporter": "^2.0.0",
+ "hardhat-ignore-warnings": "^0.2.11",
+ "lodash.startcase": "^4.4.0",
+ "micromatch": "^4.0.2",
+ "p-limit": "^3.1.0",
+ "prettier": "^3.0.0",
+ "prettier-plugin-solidity": "^1.1.0",
+ "rimraf": "^6.0.0",
+ "semver": "^7.3.5",
+ "solhint": "^5.0.0",
+ "solhint-plugin-openzeppelin": "file:scripts/solhint-custom",
+ "solidity-ast": "^0.4.50",
+ "solidity-coverage": "^0.8.5",
+ "solidity-docgen": "^0.6.0-beta.29",
+ "undici": "^6.11.1",
+ "yargs": "^17.0.0"
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/remappings.txt b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/remappings.txt
new file mode 100644
index 000000000..304d1386a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/remappings.txt
@@ -0,0 +1 @@
+@openzeppelin/contracts/=contracts/
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/renovate.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/renovate.json
new file mode 100644
index 000000000..c0b97d8d7
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/renovate.json
@@ -0,0 +1,4 @@
+{
+ "extends": ["github>OpenZeppelin/configs"],
+ "labels": ["ignore-changeset"]
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/compare-layout.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/compare-layout.js
new file mode 100644
index 000000000..64ff4398d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/compare-layout.js
@@ -0,0 +1,20 @@
+const fs = require('fs');
+const { getStorageUpgradeReport } = require('@openzeppelin/upgrades-core/dist/storage');
+
+const { ref, head } = require('yargs').argv;
+
+const oldLayout = JSON.parse(fs.readFileSync(ref));
+const newLayout = JSON.parse(fs.readFileSync(head));
+
+for (const name in oldLayout) {
+ if (name in newLayout) {
+ const report = getStorageUpgradeReport(oldLayout[name], newLayout[name], {});
+ if (!report.ok) {
+ console.log(`Storage layout incompatibility found in ${name}:`);
+ console.log(report.explain());
+ process.exitCode = 1;
+ }
+ } else {
+ console.log(`WARNING: ${name} is missing from the current branch`);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js
new file mode 100644
index 000000000..2c7b4dc24
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js
@@ -0,0 +1,247 @@
+#!/usr/bin/env node
+
+const fs = require('fs');
+const chalk = require('chalk');
+const { argv } = require('yargs')
+ .env()
+ .options({
+ style: {
+ type: 'string',
+ choices: ['shell', 'markdown'],
+ default: 'shell',
+ },
+ hideEqual: {
+ type: 'boolean',
+ default: true,
+ },
+ strictTesting: {
+ type: 'boolean',
+ default: false,
+ },
+ });
+
+// Deduce base tx cost from the percentage denominator
+const BASE_TX_COST = 21000;
+
+// Utilities
+function sum(...args) {
+ return args.reduce((a, b) => a + b, 0);
+}
+
+function average(...args) {
+ return sum(...args) / args.length;
+}
+
+function variation(current, previous, offset = 0) {
+ return {
+ value: current,
+ delta: current - previous,
+ prcnt: (100 * (current - previous)) / (previous - offset),
+ };
+}
+
+// Report class
+class Report {
+ // Read report file
+ static load(filepath) {
+ return JSON.parse(fs.readFileSync(filepath, 'utf8'));
+ }
+
+ // Compare two reports
+ static compare(update, ref, opts = { hideEqual: true, strictTesting: false }) {
+ if (JSON.stringify(update.options?.solcInfo) !== JSON.stringify(ref.options?.solcInfo)) {
+ console.warn('WARNING: Reports produced with non matching metadata');
+ }
+
+ // gasReporter 1.0.0 uses ".info", but 2.0.0 uses ".data"
+ const updateInfo = update.info ?? update.data;
+ const refInfo = ref.info ?? ref.data;
+
+ const deployments = updateInfo.deployments
+ .map(contract =>
+ Object.assign(contract, { previousVersion: refInfo.deployments.find(({ name }) => name === contract.name) }),
+ )
+ .filter(contract => contract.gasData?.length && contract.previousVersion?.gasData?.length)
+ .flatMap(contract => [
+ {
+ contract: contract.name,
+ method: '[bytecode length]',
+ avg: variation(contract.bytecode.length / 2 - 1, contract.previousVersion.bytecode.length / 2 - 1),
+ },
+ {
+ contract: contract.name,
+ method: '[construction cost]',
+ avg: variation(
+ ...[contract.gasData, contract.previousVersion.gasData].map(x => Math.round(average(...x))),
+ BASE_TX_COST,
+ ),
+ },
+ ])
+ .sort((a, b) => `${a.contract}:${a.method}`.localeCompare(`${b.contract}:${b.method}`));
+
+ const methods = Object.keys(updateInfo.methods)
+ .filter(key => refInfo.methods[key])
+ .filter(key => updateInfo.methods[key].numberOfCalls > 0)
+ .filter(
+ key => !opts.strictTesting || updateInfo.methods[key].numberOfCalls === refInfo.methods[key].numberOfCalls,
+ )
+ .map(key => ({
+ contract: refInfo.methods[key].contract,
+ method: refInfo.methods[key].fnSig,
+ min: variation(...[updateInfo, refInfo].map(x => Math.min(...x.methods[key].gasData)), BASE_TX_COST),
+ max: variation(...[updateInfo, refInfo].map(x => Math.max(...x.methods[key].gasData)), BASE_TX_COST),
+ avg: variation(...[updateInfo, refInfo].map(x => Math.round(average(...x.methods[key].gasData))), BASE_TX_COST),
+ }))
+ .sort((a, b) => `${a.contract}:${a.method}`.localeCompare(`${b.contract}:${b.method}`));
+
+ return []
+ .concat(deployments, methods)
+ .filter(row => !opts.hideEqual || row.min?.delta || row.max?.delta || row.avg?.delta);
+ }
+}
+
+// Display
+function center(text, length) {
+ return text.padStart((text.length + length) / 2).padEnd(length);
+}
+
+function plusSign(num) {
+ return num > 0 ? '+' : '';
+}
+
+function formatCellShell(cell) {
+ const format = chalk[cell?.delta > 0 ? 'red' : cell?.delta < 0 ? 'green' : 'reset'];
+ return [
+ format((!isFinite(cell?.value) ? '-' : cell.value.toString()).padStart(8)),
+ format((!isFinite(cell?.delta) ? '-' : plusSign(cell.delta) + cell.delta.toString()).padStart(8)),
+ format((!isFinite(cell?.prcnt) ? '-' : plusSign(cell.prcnt) + cell.prcnt.toFixed(2) + '%').padStart(8)),
+ ];
+}
+
+function formatCmpShell(rows) {
+ const contractLength = Math.max(8, ...rows.map(({ contract }) => contract.length));
+ const methodLength = Math.max(7, ...rows.map(({ method }) => method.length));
+
+ const COLS = [
+ { txt: '', length: 0 },
+ { txt: 'Contract', length: contractLength },
+ { txt: 'Method', length: methodLength },
+ { txt: 'Min', length: 30 },
+ { txt: 'Max', length: 30 },
+ { txt: 'Avg', length: 30 },
+ { txt: '', length: 0 },
+ ];
+ const HEADER = COLS.map(entry => chalk.bold(center(entry.txt, entry.length || 0)))
+ .join(' | ')
+ .trim();
+ const SEPARATOR = COLS.map(({ length }) => (length > 0 ? '-'.repeat(length + 2) : ''))
+ .join('|')
+ .trim();
+
+ return [
+ '',
+ HEADER,
+ ...rows.map(entry =>
+ [
+ '',
+ chalk.grey(entry.contract.padEnd(contractLength)),
+ entry.method.padEnd(methodLength),
+ ...formatCellShell(entry.min),
+ ...formatCellShell(entry.max),
+ ...formatCellShell(entry.avg),
+ '',
+ ]
+ .join(' | ')
+ .trim(),
+ ),
+ '',
+ ]
+ .join(`\n${SEPARATOR}\n`)
+ .trim();
+}
+
+function alignPattern(align) {
+ switch (align) {
+ case 'left':
+ case undefined:
+ return ':-';
+ case 'right':
+ return '-:';
+ case 'center':
+ return ':-:';
+ }
+}
+
+function trend(value) {
+ return value > 0 ? ':x:' : value < 0 ? ':heavy_check_mark:' : ':heavy_minus_sign:';
+}
+
+function formatCellMarkdown(cell) {
+ return [
+ !isFinite(cell?.value) ? '-' : cell.value.toString(),
+ !isFinite(cell?.delta) ? '-' : plusSign(cell.delta) + cell.delta.toString(),
+ !isFinite(cell?.prcnt) ? '-' : plusSign(cell.prcnt) + cell.prcnt.toFixed(2) + '% ' + trend(cell.delta),
+ ];
+}
+
+function formatCmpMarkdown(rows) {
+ const COLS = [
+ { txt: '' },
+ { txt: 'Contract', align: 'left' },
+ { txt: 'Method', align: 'left' },
+ { txt: 'Min', align: 'right' },
+ { txt: '(+/-)', align: 'right' },
+ { txt: '%', align: 'right' },
+ { txt: 'Max', align: 'right' },
+ { txt: '(+/-)', align: 'right' },
+ { txt: '%', align: 'right' },
+ { txt: 'Avg', align: 'right' },
+ { txt: '(+/-)', align: 'right' },
+ { txt: '%', align: 'right' },
+ { txt: '' },
+ ];
+ const HEADER = COLS.map(entry => entry.txt)
+ .join(' | ')
+ .trim();
+ const SEPARATOR = COLS.map(entry => (entry.txt ? alignPattern(entry.align) : ''))
+ .join('|')
+ .trim();
+
+ return [
+ '# Changes to gas costs',
+ '',
+ HEADER,
+ SEPARATOR,
+ rows
+ .map(entry =>
+ [
+ '',
+ entry.contract,
+ entry.method,
+ ...formatCellMarkdown(entry.min),
+ ...formatCellMarkdown(entry.max),
+ ...formatCellMarkdown(entry.avg),
+ '',
+ ]
+ .join(' | ')
+ .trim(),
+ )
+ .join('\n'),
+ '',
+ ]
+ .join('\n')
+ .trim();
+}
+
+// MAIN
+const report = Report.compare(Report.load(argv._[0]), Report.load(argv._[1]), argv);
+
+switch (argv.style) {
+ case 'markdown':
+ console.log(formatCmpMarkdown(report));
+ break;
+ case 'shell':
+ default:
+ console.log(formatCmpShell(report));
+ break;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/coverage.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/coverage.sh
new file mode 100644
index 000000000..a591069c4
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/coverage.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+export COVERAGE=true
+export FOUNDRY_FUZZ_RUNS=10
+
+# Hardhat coverage
+hardhat coverage
+
+if [ "${CI:-"false"}" == "true" ]; then
+ # Foundry coverage
+ forge coverage --report lcov --ir-minimum
+ # Remove zero hits
+ sed -i '/,0/d' lcov.info
+fi
+
+# Reports are then uploaded to Codecov automatically by workflow, and merged.
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/extract-layout.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/extract-layout.js
new file mode 100644
index 000000000..d0b99653a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/extract-layout.js
@@ -0,0 +1,38 @@
+const fs = require('fs');
+const { findAll, astDereferencer, srcDecoder } = require('solidity-ast/utils');
+const { extractStorageLayout } = require('@openzeppelin/upgrades-core/dist/storage/extract');
+
+const { _ } = require('yargs').argv;
+
+const skipPath = ['contracts/mocks/', 'contracts-exposed/'];
+const skipKind = ['interface', 'library'];
+
+function extractLayouts(path) {
+ const layout = {};
+ const { input, output } = JSON.parse(fs.readFileSync(path));
+
+ const decoder = srcDecoder(input, output);
+ const deref = astDereferencer(output);
+
+ for (const src in output.contracts) {
+ if (skipPath.some(prefix => src.startsWith(prefix))) {
+ continue;
+ }
+
+ for (const contractDef of findAll('ContractDefinition', output.sources[src].ast)) {
+ if (skipKind.includes(contractDef.contractKind)) {
+ continue;
+ }
+
+ layout[contractDef.name] = extractStorageLayout(
+ contractDef,
+ decoder,
+ deref,
+ output.contracts[src][contractDef.name].storageLayout,
+ );
+ }
+ }
+ return layout;
+}
+
+console.log(JSON.stringify(Object.assign(..._.map(extractLayouts))));
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/generation.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/generation.sh
new file mode 100644
index 000000000..00d609f94
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/generation.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+npm run generate
+git diff -R --exit-code
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js
new file mode 100644
index 000000000..4ed2deec4
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js
@@ -0,0 +1,55 @@
+#!/usr/bin/env node
+
+const path = require('path');
+const graphlib = require('graphlib');
+const match = require('micromatch');
+const { findAll } = require('solidity-ast/utils');
+const { _: artifacts } = require('yargs').argv;
+
+// files to skip
+const skipPatterns = ['contracts-exposed/**', 'contracts/mocks/**'];
+
+for (const artifact of artifacts) {
+ const { output: solcOutput } = require(path.resolve(__dirname, '../..', artifact));
+
+ const graph = new graphlib.Graph({ directed: true });
+ const names = {};
+ const linearized = [];
+
+ for (const source in solcOutput.contracts) {
+ if (match.any(source, skipPatterns)) continue;
+ for (const contractDef of findAll('ContractDefinition', solcOutput.sources[source].ast)) {
+ names[contractDef.id] = contractDef.name;
+ linearized.push(contractDef.linearizedBaseContracts);
+
+ contractDef.linearizedBaseContracts.forEach((c1, i, contracts) =>
+ contracts.slice(i + 1).forEach(c2 => {
+ graph.setEdge(c1, c2);
+ }),
+ );
+ }
+ }
+
+ /// graphlib.alg.findCycles will not find minimal cycles.
+ /// We are only interested int cycles of lengths 2 (needs proof)
+ graph.nodes().forEach((x, i, nodes) =>
+ nodes
+ .slice(i + 1)
+ .filter(y => graph.hasEdge(x, y) && graph.hasEdge(y, x))
+ .forEach(y => {
+ console.log(`Conflict between ${names[x]} and ${names[y]} detected in the following dependency chains:`);
+ linearized
+ .filter(chain => chain.includes(parseInt(x)) && chain.includes(parseInt(y)))
+ .forEach(chain => {
+ const comp = chain.indexOf(parseInt(x)) < chain.indexOf(parseInt(y)) ? '>' : '<';
+ console.log(`- ${names[x]} ${comp} ${names[y]} in ${names[chain.find(Boolean)]}`);
+ // console.log(`- ${names[x]} ${comp} ${names[y]}: ${chain.reverse().map(id => names[id]).join(', ')}`);
+ });
+ process.exitCode = 1;
+ }),
+ );
+}
+
+if (!process.exitCode) {
+ console.log('Contract ordering is consistent.');
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/pragma-consistency.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/pragma-consistency.js
new file mode 100644
index 000000000..f2f3c548f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/pragma-consistency.js
@@ -0,0 +1,49 @@
+#!/usr/bin/env node
+
+const path = require('path');
+const semver = require('semver');
+const match = require('micromatch');
+const { findAll } = require('solidity-ast/utils');
+const { _: artifacts } = require('yargs').argv;
+
+// files to skip
+const skipPatterns = ['contracts-exposed/**', 'contracts/mocks/WithInit.sol'];
+
+for (const artifact of artifacts) {
+ const { output: solcOutput } = require(path.resolve(__dirname, '../..', artifact));
+
+ const pragma = {};
+
+ // Extract pragma directive for all files
+ for (const source in solcOutput.contracts) {
+ if (match.any(source, skipPatterns)) continue;
+ for (const { literals } of findAll('PragmaDirective', solcOutput.sources[source].ast)) {
+ // There should only be one.
+ const [first, ...rest] = literals;
+ if (first === 'solidity') pragma[source] = rest.join('');
+ }
+ }
+
+ // Compare the pragma directive of the file, to that of the files it imports
+ for (const source in solcOutput.contracts) {
+ if (match.any(source, skipPatterns)) continue;
+ // minimum version of the compiler that matches source's pragma
+ const minVersion = semver.minVersion(pragma[source]);
+ // loop over all imports in source
+ for (const { absolutePath } of findAll('ImportDirective', solcOutput.sources[source].ast)) {
+ // So files that only import without declaring anything cause issues, because they don't shop in in "pragma"
+ if (!pragma[absolutePath]) continue;
+ // Check that the minVersion for source satisfies the requirements of the imported files
+ if (!semver.satisfies(minVersion, pragma[absolutePath])) {
+ console.log(
+ `- ${source} uses ${pragma[source]} but depends on ${absolutePath} that requires ${pragma[absolutePath]}`,
+ );
+ process.exitCode = 1;
+ }
+ }
+ }
+}
+
+if (!process.exitCode) {
+ console.log('Pragma directives are consistent.');
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/gen-nav.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/gen-nav.js
new file mode 100644
index 000000000..de3d0daba
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/gen-nav.js
@@ -0,0 +1,41 @@
+#!/usr/bin/env node
+
+const path = require('path');
+const glob = require('glob');
+const startCase = require('lodash.startcase');
+
+const baseDir = process.argv[2];
+
+const files = glob.sync(baseDir + '/**/*.adoc').map(f => path.relative(baseDir, f));
+
+console.log('.API');
+
+function getPageTitle(directory) {
+ switch (directory) {
+ case 'metatx':
+ return 'Meta Transactions';
+ case 'common':
+ return 'Common (Tokens)';
+ default:
+ return startCase(directory);
+ }
+}
+
+const links = files.map(file => {
+ const doc = file.replace(baseDir, '');
+ const title = path.parse(file).name;
+
+ return {
+ xref: `* xref:${doc}[${getPageTitle(title)}]`,
+ title,
+ };
+});
+
+// Case-insensitive sort based on titles (so 'token/ERC20' gets sorted as 'erc20')
+const sortedLinks = links.sort(function (a, b) {
+ return a.title.toLowerCase().localeCompare(b.title.toLowerCase(), undefined, { numeric: true });
+});
+
+for (const link of sortedLinks) {
+ console.log(link.xref);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/format-lines.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/format-lines.js
new file mode 100644
index 000000000..fa3d6b120
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/format-lines.js
@@ -0,0 +1,16 @@
+function formatLines(...lines) {
+ return [...indentEach(0, lines)].join('\n') + '\n';
+}
+
+function* indentEach(indent, lines) {
+ for (const line of lines) {
+ if (Array.isArray(line)) {
+ yield* indentEach(indent + 1, line);
+ } else {
+ const padding = ' '.repeat(indent);
+ yield* line.split('\n').map(subline => (subline === '' ? '' : padding + subline));
+ }
+ }
+}
+
+module.exports = formatLines;
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/helpers/sanitize.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/helpers/sanitize.js
new file mode 100644
index 000000000..e680ec1bf
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/helpers/sanitize.js
@@ -0,0 +1,5 @@
+module.exports = {
+ address: expr => `and(${expr}, shr(96, not(0)))`,
+ bool: expr => `iszero(iszero(${expr}))`,
+ bytes: (expr, size) => `and(${expr}, shl(${256 - 8 * size}, not(0)))`,
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/run.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/run.js
new file mode 100644
index 000000000..6779c93f4
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/run.js
@@ -0,0 +1,58 @@
+#!/usr/bin/env node
+
+// const cp = require('child_process');
+const fs = require('fs');
+const path = require('path');
+const format = require('./format-lines');
+
+function getVersion(path) {
+ try {
+ return fs.readFileSync(path, 'utf8').match(/\/\/ OpenZeppelin Contracts \(last updated v[^)]+\)/)[0];
+ } catch {
+ return null;
+ }
+}
+
+function generateFromTemplate(file, template, outputPrefix = '') {
+ const script = path.relative(path.join(__dirname, '../..'), __filename);
+ const input = path.join(path.dirname(script), template);
+ const output = path.join(outputPrefix, file);
+ const version = getVersion(output);
+ const content = format(
+ '// SPDX-License-Identifier: MIT',
+ ...(version ? [version + ` (${file})`] : []),
+ `// This file was procedurally generated from ${input}.`,
+ '',
+ require(template).trimEnd(),
+ );
+
+ fs.writeFileSync(output, content);
+ // cp.execFileSync('prettier', ['--write', output]);
+}
+
+// Contracts
+for (const [file, template] of Object.entries({
+ 'utils/cryptography/MerkleProof.sol': './templates/MerkleProof.js',
+ 'utils/math/SafeCast.sol': './templates/SafeCast.js',
+ 'utils/structs/Checkpoints.sol': './templates/Checkpoints.js',
+ 'utils/structs/EnumerableSet.sol': './templates/EnumerableSet.js',
+ 'utils/structs/EnumerableMap.sol': './templates/EnumerableMap.js',
+ 'utils/SlotDerivation.sol': './templates/SlotDerivation.js',
+ 'utils/StorageSlot.sol': './templates/StorageSlot.js',
+ 'utils/TransientSlot.sol': './templates/TransientSlot.js',
+ 'utils/Arrays.sol': './templates/Arrays.js',
+ 'utils/Packing.sol': './templates/Packing.js',
+ 'mocks/StorageSlotMock.sol': './templates/StorageSlotMock.js',
+ 'mocks/TransientSlotMock.sol': './templates/TransientSlotMock.js',
+})) {
+ generateFromTemplate(file, template, './contracts/');
+}
+
+// Tests
+for (const [file, template] of Object.entries({
+ 'utils/structs/Checkpoints.t.sol': './templates/Checkpoints.t.js',
+ 'utils/Packing.t.sol': './templates/Packing.t.js',
+ 'utils/SlotDerivation.t.sol': './templates/SlotDerivation.t.js',
+})) {
+ generateFromTemplate(file, template, './test/');
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.js
new file mode 100644
index 000000000..0d3676a72
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.js
@@ -0,0 +1,384 @@
+const format = require('../format-lines');
+const { capitalize } = require('../../helpers');
+const { TYPES } = require('./Arrays.opts');
+
+const header = `\
+pragma solidity ^0.8.20;
+
+import {Comparators} from "./Comparators.sol";
+import {SlotDerivation} from "./SlotDerivation.sol";
+import {StorageSlot} from "./StorageSlot.sol";
+import {Math} from "./math/Math.sol";
+
+/**
+ * @dev Collection of functions related to array types.
+ */
+`;
+
+const sort = type => `\
+/**
+ * @dev Sort an array of ${type} (in memory) following the provided comparator function.
+ *
+ * This function does the sorting "in place", meaning that it overrides the input. The object is returned for
+ * convenience, but that returned value can be discarded safely if the caller has a memory pointer to the array.
+ *
+ * NOTE: this function's cost is \`O(n · log(n))\` in average and \`O(n²)\` in the worst case, with n the length of the
+ * array. Using it in view functions that are executed through \`eth_call\` is safe, but one should be very careful
+ * when executing this as part of a transaction. If the array being sorted is too large, the sort operation may
+ * consume more gas than is available in a block, leading to potential DoS.
+ *
+ * IMPORTANT: Consider memory side-effects when using custom comparator functions that access memory in an unsafe way.
+ */
+function sort(
+ ${type}[] memory array,
+ function(${type}, ${type}) pure returns (bool) comp
+) internal pure returns (${type}[] memory) {
+ ${
+ type === 'uint256'
+ ? '_quickSort(_begin(array), _end(array), comp);'
+ : 'sort(_castToUint256Array(array), _castToUint256Comp(comp));'
+ }
+ return array;
+}
+
+/**
+ * @dev Variant of {sort} that sorts an array of ${type} in increasing order.
+ */
+function sort(${type}[] memory array) internal pure returns (${type}[] memory) {
+ ${type === 'uint256' ? 'sort(array, Comparators.lt);' : 'sort(_castToUint256Array(array), Comparators.lt);'}
+ return array;
+}
+`;
+
+const quickSort = `\
+/**
+ * @dev Performs a quick sort of a segment of memory. The segment sorted starts at \`begin\` (inclusive), and stops
+ * at end (exclusive). Sorting follows the \`comp\` comparator.
+ *
+ * Invariant: \`begin <= end\`. This is the case when initially called by {sort} and is preserved in subcalls.
+ *
+ * IMPORTANT: Memory locations between \`begin\` and \`end\` are not validated/zeroed. This function should
+ * be used only if the limits are within a memory array.
+ */
+function _quickSort(uint256 begin, uint256 end, function(uint256, uint256) pure returns (bool) comp) private pure {
+ unchecked {
+ if (end - begin < 0x40) return;
+
+ // Use first element as pivot
+ uint256 pivot = _mload(begin);
+ // Position where the pivot should be at the end of the loop
+ uint256 pos = begin;
+
+ for (uint256 it = begin + 0x20; it < end; it += 0x20) {
+ if (comp(_mload(it), pivot)) {
+ // If the value stored at the iterator's position comes before the pivot, we increment the
+ // position of the pivot and move the value there.
+ pos += 0x20;
+ _swap(pos, it);
+ }
+ }
+
+ _swap(begin, pos); // Swap pivot into place
+ _quickSort(begin, pos, comp); // Sort the left side of the pivot
+ _quickSort(pos + 0x20, end, comp); // Sort the right side of the pivot
+ }
+}
+
+/**
+ * @dev Pointer to the memory location of the first element of \`array\`.
+ */
+function _begin(uint256[] memory array) private pure returns (uint256 ptr) {
+ assembly ("memory-safe") {
+ ptr := add(array, 0x20)
+ }
+}
+
+/**
+ * @dev Pointer to the memory location of the first memory word (32bytes) after \`array\`. This is the memory word
+ * that comes just after the last element of the array.
+ */
+function _end(uint256[] memory array) private pure returns (uint256 ptr) {
+ unchecked {
+ return _begin(array) + array.length * 0x20;
+ }
+}
+
+/**
+ * @dev Load memory word (as a uint256) at location \`ptr\`.
+ */
+function _mload(uint256 ptr) private pure returns (uint256 value) {
+ assembly {
+ value := mload(ptr)
+ }
+}
+
+/**
+ * @dev Swaps the elements memory location \`ptr1\` and \`ptr2\`.
+ */
+function _swap(uint256 ptr1, uint256 ptr2) private pure {
+ assembly {
+ let value1 := mload(ptr1)
+ let value2 := mload(ptr2)
+ mstore(ptr1, value2)
+ mstore(ptr2, value1)
+ }
+}
+`;
+
+const castArray = type => `\
+/// @dev Helper: low level cast ${type} memory array to uint256 memory array
+function _castToUint256Array(${type}[] memory input) private pure returns (uint256[] memory output) {
+ assembly {
+ output := input
+ }
+}
+`;
+
+const castComparator = type => `\
+/// @dev Helper: low level cast ${type} comp function to uint256 comp function
+function _castToUint256Comp(
+ function(${type}, ${type}) pure returns (bool) input
+) private pure returns (function(uint256, uint256) pure returns (bool) output) {
+ assembly {
+ output := input
+ }
+}
+`;
+
+const search = `\
+/**
+ * @dev Searches a sorted \`array\` and returns the first index that contains
+ * a value greater or equal to \`element\`. If no such index exists (i.e. all
+ * values in the array are strictly less than \`element\`), the array length is
+ * returned. Time complexity O(log n).
+ *
+ * NOTE: The \`array\` is expected to be sorted in ascending order, and to
+ * contain no repeated elements.
+ *
+ * IMPORTANT: Deprecated. This implementation behaves as {lowerBound} but lacks
+ * support for repeated elements in the array. The {lowerBound} function should
+ * be used instead.
+ */
+function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
+ uint256 low = 0;
+ uint256 high = array.length;
+
+ if (high == 0) {
+ return 0;
+ }
+
+ while (low < high) {
+ uint256 mid = Math.average(low, high);
+
+ // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
+ // because Math.average rounds towards zero (it does integer division with truncation).
+ if (unsafeAccess(array, mid).value > element) {
+ high = mid;
+ } else {
+ low = mid + 1;
+ }
+ }
+
+ // At this point \`low\` is the exclusive upper bound. We will return the inclusive upper bound.
+ if (low > 0 && unsafeAccess(array, low - 1).value == element) {
+ return low - 1;
+ } else {
+ return low;
+ }
+}
+
+/**
+ * @dev Searches an \`array\` sorted in ascending order and returns the first
+ * index that contains a value greater or equal than \`element\`. If no such index
+ * exists (i.e. all values in the array are strictly less than \`element\`), the array
+ * length is returned. Time complexity O(log n).
+ *
+ * See C++'s https://en.cppreference.com/w/cpp/algorithm/lower_bound[lower_bound].
+ */
+function lowerBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
+ uint256 low = 0;
+ uint256 high = array.length;
+
+ if (high == 0) {
+ return 0;
+ }
+
+ while (low < high) {
+ uint256 mid = Math.average(low, high);
+
+ // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
+ // because Math.average rounds towards zero (it does integer division with truncation).
+ if (unsafeAccess(array, mid).value < element) {
+ // this cannot overflow because mid < high
+ unchecked {
+ low = mid + 1;
+ }
+ } else {
+ high = mid;
+ }
+ }
+
+ return low;
+}
+
+/**
+ * @dev Searches an \`array\` sorted in ascending order and returns the first
+ * index that contains a value strictly greater than \`element\`. If no such index
+ * exists (i.e. all values in the array are strictly less than \`element\`), the array
+ * length is returned. Time complexity O(log n).
+ *
+ * See C++'s https://en.cppreference.com/w/cpp/algorithm/upper_bound[upper_bound].
+ */
+function upperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
+ uint256 low = 0;
+ uint256 high = array.length;
+
+ if (high == 0) {
+ return 0;
+ }
+
+ while (low < high) {
+ uint256 mid = Math.average(low, high);
+
+ // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
+ // because Math.average rounds towards zero (it does integer division with truncation).
+ if (unsafeAccess(array, mid).value > element) {
+ high = mid;
+ } else {
+ // this cannot overflow because mid < high
+ unchecked {
+ low = mid + 1;
+ }
+ }
+ }
+
+ return low;
+}
+
+/**
+ * @dev Same as {lowerBound}, but with an array in memory.
+ */
+function lowerBoundMemory(uint256[] memory array, uint256 element) internal pure returns (uint256) {
+ uint256 low = 0;
+ uint256 high = array.length;
+
+ if (high == 0) {
+ return 0;
+ }
+
+ while (low < high) {
+ uint256 mid = Math.average(low, high);
+
+ // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
+ // because Math.average rounds towards zero (it does integer division with truncation).
+ if (unsafeMemoryAccess(array, mid) < element) {
+ // this cannot overflow because mid < high
+ unchecked {
+ low = mid + 1;
+ }
+ } else {
+ high = mid;
+ }
+ }
+
+ return low;
+}
+
+/**
+ * @dev Same as {upperBound}, but with an array in memory.
+ */
+function upperBoundMemory(uint256[] memory array, uint256 element) internal pure returns (uint256) {
+ uint256 low = 0;
+ uint256 high = array.length;
+
+ if (high == 0) {
+ return 0;
+ }
+
+ while (low < high) {
+ uint256 mid = Math.average(low, high);
+
+ // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
+ // because Math.average rounds towards zero (it does integer division with truncation).
+ if (unsafeMemoryAccess(array, mid) > element) {
+ high = mid;
+ } else {
+ // this cannot overflow because mid < high
+ unchecked {
+ low = mid + 1;
+ }
+ }
+ }
+
+ return low;
+}
+`;
+
+const unsafeAccessStorage = type => `\
+/**
+ * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
+ *
+ * WARNING: Only use if you are certain \`pos\` is lower than the array length.
+ */
+function unsafeAccess(${type}[] storage arr, uint256 pos) internal pure returns (StorageSlot.${capitalize(
+ type,
+)}Slot storage) {
+ bytes32 slot;
+ assembly ("memory-safe") {
+ slot := arr.slot
+ }
+ return slot.deriveArray().offset(pos).get${capitalize(type)}Slot();
+}
+`;
+
+const unsafeAccessMemory = type => `\
+/**
+ * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
+ *
+ * WARNING: Only use if you are certain \`pos\` is lower than the array length.
+ */
+function unsafeMemoryAccess(${type}[] memory arr, uint256 pos) internal pure returns (${type} res) {
+ assembly {
+ res := mload(add(add(arr, 0x20), mul(pos, 0x20)))
+ }
+}
+`;
+
+const unsafeSetLength = type => `\
+/**
+ * @dev Helper to set the length of an dynamic array. Directly writing to \`.length\` is forbidden.
+ *
+ * WARNING: this does not clear elements if length is reduced, of initialize elements if length is increased.
+ */
+function unsafeSetLength(${type}[] storage array, uint256 len) internal {
+ assembly ("memory-safe") {
+ sstore(array.slot, len)
+ }
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library Arrays {',
+ format(
+ [].concat(
+ 'using SlotDerivation for bytes32;',
+ 'using StorageSlot for bytes32;',
+ '',
+ // sorting, comparator, helpers and internal
+ sort('uint256'),
+ TYPES.filter(type => type !== 'uint256').map(sort),
+ quickSort,
+ TYPES.filter(type => type !== 'uint256').map(castArray),
+ TYPES.filter(type => type !== 'uint256').map(castComparator),
+ // lookup
+ search,
+ // unsafe (direct) storage and memory access
+ TYPES.map(unsafeAccessStorage),
+ TYPES.map(unsafeAccessMemory),
+ TYPES.map(unsafeSetLength),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.opts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.opts.js
new file mode 100644
index 000000000..67f329972
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.opts.js
@@ -0,0 +1,3 @@
+const TYPES = ['address', 'bytes32', 'uint256'];
+
+module.exports = { TYPES };
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js
new file mode 100644
index 000000000..7ec4a7253
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js
@@ -0,0 +1,242 @@
+const format = require('../format-lines');
+const { OPTS } = require('./Checkpoints.opts');
+
+// TEMPLATE
+const header = `\
+pragma solidity ^0.8.20;
+
+import {Math} from "../math/Math.sol";
+
+/**
+ * @dev This library defines the \`Trace*\` struct, for checkpointing values as they change at different points in
+ * time, and later looking up past values by block number. See {Votes} as an example.
+ *
+ * To create a history of checkpoints define a variable type \`Checkpoints.Trace*\` in your contract, and store a new
+ * checkpoint for the current transaction block using the {push} function.
+ */
+`;
+
+const errors = `\
+/**
+ * @dev A value was attempted to be inserted on a past checkpoint.
+ */
+error CheckpointUnorderedInsertion();
+`;
+
+const template = opts => `\
+struct ${opts.historyTypeName} {
+ ${opts.checkpointTypeName}[] ${opts.checkpointFieldName};
+}
+
+struct ${opts.checkpointTypeName} {
+ ${opts.keyTypeName} ${opts.keyFieldName};
+ ${opts.valueTypeName} ${opts.valueFieldName};
+}
+
+/**
+ * @dev Pushes a (\`key\`, \`value\`) pair into a ${opts.historyTypeName} so that it is stored as the checkpoint.
+ *
+ * Returns previous value and new value.
+ *
+ * IMPORTANT: Never accept \`key\` as a user input, since an arbitrary \`type(${opts.keyTypeName}).max\` key set will disable the
+ * library.
+ */
+function push(
+ ${opts.historyTypeName} storage self,
+ ${opts.keyTypeName} key,
+ ${opts.valueTypeName} value
+) internal returns (${opts.valueTypeName} oldValue, ${opts.valueTypeName} newValue) {
+ return _insert(self.${opts.checkpointFieldName}, key, value);
+}
+
+/**
+ * @dev Returns the value in the first (oldest) checkpoint with key greater or equal than the search key, or zero if
+ * there is none.
+ */
+function lowerLookup(${opts.historyTypeName} storage self, ${opts.keyTypeName} key) internal view returns (${opts.valueTypeName}) {
+ uint256 len = self.${opts.checkpointFieldName}.length;
+ uint256 pos = _lowerBinaryLookup(self.${opts.checkpointFieldName}, key, 0, len);
+ return pos == len ? 0 : _unsafeAccess(self.${opts.checkpointFieldName}, pos).${opts.valueFieldName};
+}
+
+/**
+ * @dev Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero
+ * if there is none.
+ */
+function upperLookup(${opts.historyTypeName} storage self, ${opts.keyTypeName} key) internal view returns (${opts.valueTypeName}) {
+ uint256 len = self.${opts.checkpointFieldName}.length;
+ uint256 pos = _upperBinaryLookup(self.${opts.checkpointFieldName}, key, 0, len);
+ return pos == 0 ? 0 : _unsafeAccess(self.${opts.checkpointFieldName}, pos - 1).${opts.valueFieldName};
+}
+
+/**
+ * @dev Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero
+ * if there is none.
+ *
+ * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high
+ * keys).
+ */
+function upperLookupRecent(${opts.historyTypeName} storage self, ${opts.keyTypeName} key) internal view returns (${opts.valueTypeName}) {
+ uint256 len = self.${opts.checkpointFieldName}.length;
+
+ uint256 low = 0;
+ uint256 high = len;
+
+ if (len > 5) {
+ uint256 mid = len - Math.sqrt(len);
+ if (key < _unsafeAccess(self.${opts.checkpointFieldName}, mid)._key) {
+ high = mid;
+ } else {
+ low = mid + 1;
+ }
+ }
+
+ uint256 pos = _upperBinaryLookup(self.${opts.checkpointFieldName}, key, low, high);
+
+ return pos == 0 ? 0 : _unsafeAccess(self.${opts.checkpointFieldName}, pos - 1).${opts.valueFieldName};
+}
+
+/**
+ * @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints.
+ */
+function latest(${opts.historyTypeName} storage self) internal view returns (${opts.valueTypeName}) {
+ uint256 pos = self.${opts.checkpointFieldName}.length;
+ return pos == 0 ? 0 : _unsafeAccess(self.${opts.checkpointFieldName}, pos - 1).${opts.valueFieldName};
+}
+
+/**
+ * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value
+ * in the most recent checkpoint.
+ */
+function latestCheckpoint(${opts.historyTypeName} storage self) internal view returns (bool exists, ${opts.keyTypeName} ${opts.keyFieldName}, ${opts.valueTypeName} ${opts.valueFieldName}) {
+ uint256 pos = self.${opts.checkpointFieldName}.length;
+ if (pos == 0) {
+ return (false, 0, 0);
+ } else {
+ ${opts.checkpointTypeName} storage ckpt = _unsafeAccess(self.${opts.checkpointFieldName}, pos - 1);
+ return (true, ckpt.${opts.keyFieldName}, ckpt.${opts.valueFieldName});
+ }
+}
+
+/**
+ * @dev Returns the number of checkpoint.
+ */
+function length(${opts.historyTypeName} storage self) internal view returns (uint256) {
+ return self.${opts.checkpointFieldName}.length;
+}
+
+/**
+ * @dev Returns checkpoint at given position.
+ */
+function at(${opts.historyTypeName} storage self, uint32 pos) internal view returns (${opts.checkpointTypeName} memory) {
+ return self.${opts.checkpointFieldName}[pos];
+}
+
+/**
+ * @dev Pushes a (\`key\`, \`value\`) pair into an ordered list of checkpoints, either by inserting a new checkpoint,
+ * or by updating the last one.
+ */
+function _insert(
+ ${opts.checkpointTypeName}[] storage self,
+ ${opts.keyTypeName} key,
+ ${opts.valueTypeName} value
+) private returns (${opts.valueTypeName} oldValue, ${opts.valueTypeName} newValue) {
+ uint256 pos = self.length;
+
+ if (pos > 0) {
+ ${opts.checkpointTypeName} storage last = _unsafeAccess(self, pos - 1);
+ ${opts.keyTypeName} lastKey = last.${opts.keyFieldName};
+ ${opts.valueTypeName} lastValue = last.${opts.valueFieldName};
+
+ // Checkpoint keys must be non-decreasing.
+ if (lastKey > key) {
+ revert CheckpointUnorderedInsertion();
+ }
+
+ // Update or push new checkpoint
+ if (lastKey == key) {
+ last.${opts.valueFieldName} = value;
+ } else {
+ self.push(${opts.checkpointTypeName}({${opts.keyFieldName}: key, ${opts.valueFieldName}: value}));
+ }
+ return (lastValue, value);
+ } else {
+ self.push(${opts.checkpointTypeName}({${opts.keyFieldName}: key, ${opts.valueFieldName}: value}));
+ return (0, value);
+ }
+}
+
+/**
+ * @dev Return the index of the first (oldest) checkpoint with key strictly bigger than the search key, or \`high\`
+ * if there is none. \`low\` and \`high\` define a section where to do the search, with inclusive \`low\` and exclusive
+ * \`high\`.
+ *
+ * WARNING: \`high\` should not be greater than the array's length.
+ */
+function _upperBinaryLookup(
+ ${opts.checkpointTypeName}[] storage self,
+ ${opts.keyTypeName} key,
+ uint256 low,
+ uint256 high
+) private view returns (uint256) {
+ while (low < high) {
+ uint256 mid = Math.average(low, high);
+ if (_unsafeAccess(self, mid).${opts.keyFieldName} > key) {
+ high = mid;
+ } else {
+ low = mid + 1;
+ }
+ }
+ return high;
+}
+
+/**
+ * @dev Return the index of the first (oldest) checkpoint with key greater or equal than the search key, or \`high\`
+ * if there is none. \`low\` and \`high\` define a section where to do the search, with inclusive \`low\` and exclusive
+ * \`high\`.
+ *
+ * WARNING: \`high\` should not be greater than the array's length.
+ */
+function _lowerBinaryLookup(
+ ${opts.checkpointTypeName}[] storage self,
+ ${opts.keyTypeName} key,
+ uint256 low,
+ uint256 high
+) private view returns (uint256) {
+ while (low < high) {
+ uint256 mid = Math.average(low, high);
+ if (_unsafeAccess(self, mid).${opts.keyFieldName} < key) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ return high;
+}
+
+/**
+ * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.
+ */
+function _unsafeAccess(
+ ${opts.checkpointTypeName}[] storage self,
+ uint256 pos
+) private pure returns (${opts.checkpointTypeName} storage result) {
+ assembly {
+ mstore(0, self.slot)
+ result.slot := add(keccak256(0, 0x20), pos)
+ }
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library Checkpoints {',
+ format(
+ [].concat(
+ errors,
+ OPTS.map(opts => template(opts)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js
new file mode 100644
index 000000000..08b7b910b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js
@@ -0,0 +1,17 @@
+// OPTIONS
+const VALUE_SIZES = [224, 208, 160];
+
+const defaultOpts = size => ({
+ historyTypeName: `Trace${size}`,
+ checkpointTypeName: `Checkpoint${size}`,
+ checkpointFieldName: '_checkpoints',
+ keyTypeName: `uint${256 - size}`,
+ keyFieldName: '_key',
+ valueTypeName: `uint${size}`,
+ valueFieldName: '_value',
+});
+
+module.exports = {
+ VALUE_SIZES,
+ OPTS: VALUE_SIZES.map(size => defaultOpts(size)),
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js
new file mode 100644
index 000000000..edd2e9f98
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js
@@ -0,0 +1,137 @@
+const format = require('../format-lines');
+const { capitalize } = require('../../helpers');
+const { OPTS } = require('./Checkpoints.opts.js');
+
+// TEMPLATE
+const header = `\
+pragma solidity ^0.8.20;
+
+import {Test} from "forge-std/Test.sol";
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol";
+`;
+
+const template = opts => `\
+using Checkpoints for Checkpoints.${opts.historyTypeName};
+
+// Maximum gap between keys used during the fuzzing tests: the \`_prepareKeys\` function with make sure that
+// key#n+1 is in the [key#n, key#n + _KEY_MAX_GAP] range.
+uint8 internal constant _KEY_MAX_GAP = 64;
+
+Checkpoints.${opts.historyTypeName} internal _ckpts;
+
+// helpers
+function _bound${capitalize(opts.keyTypeName)}(${opts.keyTypeName} x, ${opts.keyTypeName} min, ${
+ opts.keyTypeName
+} max) internal pure returns (${opts.keyTypeName}) {
+ return SafeCast.to${capitalize(opts.keyTypeName)}(bound(uint256(x), uint256(min), uint256(max)));
+}
+
+function _prepareKeys(${opts.keyTypeName}[] memory keys, ${opts.keyTypeName} maxSpread) internal pure {
+ ${opts.keyTypeName} lastKey = 0;
+ for (uint256 i = 0; i < keys.length; ++i) {
+ ${opts.keyTypeName} key = _bound${capitalize(opts.keyTypeName)}(keys[i], lastKey, lastKey + maxSpread);
+ keys[i] = key;
+ lastKey = key;
+ }
+}
+
+function _assertLatestCheckpoint(bool exist, ${opts.keyTypeName} key, ${opts.valueTypeName} value) internal {
+ (bool _exist, ${opts.keyTypeName} _key, ${opts.valueTypeName} _value) = _ckpts.latestCheckpoint();
+ assertEq(_exist, exist);
+ assertEq(_key, key);
+ assertEq(_value, value);
+}
+
+// tests
+function testPush(${opts.keyTypeName}[] memory keys, ${opts.valueTypeName}[] memory values, ${
+ opts.keyTypeName
+} pastKey) public {
+ vm.assume(values.length > 0 && values.length <= keys.length);
+ _prepareKeys(keys, _KEY_MAX_GAP);
+
+ // initial state
+ assertEq(_ckpts.length(), 0);
+ assertEq(_ckpts.latest(), 0);
+ _assertLatestCheckpoint(false, 0, 0);
+
+ uint256 duplicates = 0;
+ for (uint256 i = 0; i < keys.length; ++i) {
+ ${opts.keyTypeName} key = keys[i];
+ ${opts.valueTypeName} value = values[i % values.length];
+ if (i > 0 && key == keys[i - 1]) ++duplicates;
+
+ // push
+ _ckpts.push(key, value);
+
+ // check length & latest
+ assertEq(_ckpts.length(), i + 1 - duplicates);
+ assertEq(_ckpts.latest(), value);
+ _assertLatestCheckpoint(true, key, value);
+ }
+
+ if (keys.length > 0) {
+ ${opts.keyTypeName} lastKey = keys[keys.length - 1];
+ if (lastKey > 0) {
+ pastKey = _bound${capitalize(opts.keyTypeName)}(pastKey, 0, lastKey - 1);
+
+ vm.expectRevert();
+ this.push(pastKey, values[keys.length % values.length]);
+ }
+ }
+}
+
+// used to test reverts
+function push(${opts.keyTypeName} key, ${opts.valueTypeName} value) external {
+ _ckpts.push(key, value);
+}
+
+function testLookup(${opts.keyTypeName}[] memory keys, ${opts.valueTypeName}[] memory values, ${
+ opts.keyTypeName
+} lookup) public {
+ vm.assume(values.length > 0 && values.length <= keys.length);
+ _prepareKeys(keys, _KEY_MAX_GAP);
+
+ ${opts.keyTypeName} lastKey = keys.length == 0 ? 0 : keys[keys.length - 1];
+ lookup = _bound${capitalize(opts.keyTypeName)}(lookup, 0, lastKey + _KEY_MAX_GAP);
+
+ ${opts.valueTypeName} upper = 0;
+ ${opts.valueTypeName} lower = 0;
+ ${opts.keyTypeName} lowerKey = type(${opts.keyTypeName}).max;
+ for (uint256 i = 0; i < keys.length; ++i) {
+ ${opts.keyTypeName} key = keys[i];
+ ${opts.valueTypeName} value = values[i % values.length];
+
+ // push
+ _ckpts.push(key, value);
+
+ // track expected result of lookups
+ if (key <= lookup) {
+ upper = value;
+ }
+ // find the first key that is not smaller than the lookup key
+ if (key >= lookup && (i == 0 || keys[i - 1] < lookup)) {
+ lowerKey = key;
+ }
+ if (key == lowerKey) {
+ lower = value;
+ }
+ }
+
+ // check lookup
+ assertEq(_ckpts.lowerLookup(lookup), lower);
+ assertEq(_ckpts.upperLookup(lookup), upper);
+ assertEq(_ckpts.upperLookupRecent(lookup), upper);
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header,
+ ...OPTS.flatMap(opts => [
+ `contract Checkpoints${opts.historyTypeName}Test is Test {`,
+ [template(opts).trimEnd()],
+ '}',
+ '',
+ ]),
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js
new file mode 100644
index 000000000..c9cad6c1b
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js
@@ -0,0 +1,272 @@
+const format = require('../format-lines');
+const { fromBytes32, toBytes32 } = require('./conversion');
+const { TYPES } = require('./EnumerableMap.opts');
+
+const header = `\
+pragma solidity ^0.8.20;
+
+import {EnumerableSet} from "./EnumerableSet.sol";
+
+/**
+ * @dev Library for managing an enumerable variant of Solidity's
+ * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[\`mapping\`]
+ * type.
+ *
+ * Maps have the following properties:
+ *
+ * - Entries are added, removed, and checked for existence in constant time
+ * (O(1)).
+ * - Entries are enumerated in O(n). No guarantees are made on the ordering.
+ *
+ * \`\`\`solidity
+ * contract Example {
+ * // Add the library methods
+ * using EnumerableMap for EnumerableMap.UintToAddressMap;
+ *
+ * // Declare a set state variable
+ * EnumerableMap.UintToAddressMap private myMap;
+ * }
+ * \`\`\`
+ *
+ * The following map types are supported:
+ *
+ * - \`uint256 -> address\` (\`UintToAddressMap\`) since v3.0.0
+ * - \`address -> uint256\` (\`AddressToUintMap\`) since v4.6.0
+ * - \`bytes32 -> bytes32\` (\`Bytes32ToBytes32Map\`) since v4.6.0
+ * - \`uint256 -> uint256\` (\`UintToUintMap\`) since v4.7.0
+ * - \`bytes32 -> uint256\` (\`Bytes32ToUintMap\`) since v4.7.0
+ * - \`uint256 -> bytes32\` (\`UintToBytes32Map\`) since v5.1.0
+ * - \`address -> address\` (\`AddressToAddressMap\`) since v5.1.0
+ * - \`address -> bytes32\` (\`AddressToBytes32Map\`) since v5.1.0
+ * - \`bytes32 -> address\` (\`Bytes32ToAddressMap\`) since v5.1.0
+ *
+ * [WARNING]
+ * ====
+ * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
+ * unusable.
+ * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
+ *
+ * In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an
+ * array of EnumerableMap.
+ * ====
+ */
+`;
+
+const defaultMap = `\
+// To implement this library for multiple types with as little code repetition as possible, we write it in
+// terms of a generic Map type with bytes32 keys and values. The Map implementation uses private functions,
+// and user-facing implementations such as \`UintToAddressMap\` are just wrappers around the underlying Map.
+// This means that we can only create new EnumerableMaps for types that fit in bytes32.
+
+/**
+ * @dev Query for a nonexistent map key.
+ */
+error EnumerableMapNonexistentKey(bytes32 key);
+
+struct Bytes32ToBytes32Map {
+ // Storage of keys
+ EnumerableSet.Bytes32Set _keys;
+ mapping(bytes32 key => bytes32) _values;
+}
+
+/**
+ * @dev Adds a key-value pair to a map, or updates the value for an existing
+ * key. O(1).
+ *
+ * Returns true if the key was added to the map, that is if it was not
+ * already present.
+ */
+function set(Bytes32ToBytes32Map storage map, bytes32 key, bytes32 value) internal returns (bool) {
+ map._values[key] = value;
+ return map._keys.add(key);
+}
+
+/**
+ * @dev Removes a key-value pair from a map. O(1).
+ *
+ * Returns true if the key was removed from the map, that is if it was present.
+ */
+function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) {
+ delete map._values[key];
+ return map._keys.remove(key);
+}
+
+/**
+ * @dev Returns true if the key is in the map. O(1).
+ */
+function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) {
+ return map._keys.contains(key);
+}
+
+/**
+ * @dev Returns the number of key-value pairs in the map. O(1).
+ */
+function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) {
+ return map._keys.length();
+}
+
+/**
+ * @dev Returns the key-value pair stored at position \`index\` in the map. O(1).
+ *
+ * Note that there are no guarantees on the ordering of entries inside the
+ * array, and it may change when more entries are added or removed.
+ *
+ * Requirements:
+ *
+ * - \`index\` must be strictly less than {length}.
+ */
+function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32 key, bytes32 value) {
+ bytes32 atKey = map._keys.at(index);
+ return (atKey, map._values[atKey]);
+}
+
+/**
+ * @dev Tries to returns the value associated with \`key\`. O(1).
+ * Does not revert if \`key\` is not in the map.
+ */
+function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool exists, bytes32 value) {
+ bytes32 val = map._values[key];
+ if (val == bytes32(0)) {
+ return (contains(map, key), bytes32(0));
+ } else {
+ return (true, val);
+ }
+}
+
+/**
+ * @dev Returns the value associated with \`key\`. O(1).
+ *
+ * Requirements:
+ *
+ * - \`key\` must be in the map.
+ */
+function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) {
+ bytes32 value = map._values[key];
+ if (value == 0 && !contains(map, key)) {
+ revert EnumerableMapNonexistentKey(key);
+ }
+ return value;
+}
+
+/**
+ * @dev Return the an array containing all the keys
+ *
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
+ * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
+ */
+function keys(Bytes32ToBytes32Map storage map) internal view returns (bytes32[] memory) {
+ return map._keys.values();
+}
+`;
+
+const customMap = ({ name, keyType, valueType }) => `\
+// ${name}
+
+struct ${name} {
+ Bytes32ToBytes32Map _inner;
+}
+
+/**
+ * @dev Adds a key-value pair to a map, or updates the value for an existing
+ * key. O(1).
+ *
+ * Returns true if the key was added to the map, that is if it was not
+ * already present.
+ */
+function set(${name} storage map, ${keyType} key, ${valueType} value) internal returns (bool) {
+ return set(map._inner, ${toBytes32(keyType, 'key')}, ${toBytes32(valueType, 'value')});
+}
+
+/**
+ * @dev Removes a value from a map. O(1).
+ *
+ * Returns true if the key was removed from the map, that is if it was present.
+ */
+function remove(${name} storage map, ${keyType} key) internal returns (bool) {
+ return remove(map._inner, ${toBytes32(keyType, 'key')});
+}
+
+/**
+ * @dev Returns true if the key is in the map. O(1).
+ */
+function contains(${name} storage map, ${keyType} key) internal view returns (bool) {
+ return contains(map._inner, ${toBytes32(keyType, 'key')});
+}
+
+/**
+ * @dev Returns the number of elements in the map. O(1).
+ */
+function length(${name} storage map) internal view returns (uint256) {
+ return length(map._inner);
+}
+
+/**
+ * @dev Returns the element stored at position \`index\` in the map. O(1).
+ * Note that there are no guarantees on the ordering of values inside the
+ * array, and it may change when more values are added or removed.
+ *
+ * Requirements:
+ *
+ * - \`index\` must be strictly less than {length}.
+ */
+function at(${name} storage map, uint256 index) internal view returns (${keyType} key, ${valueType} value) {
+ (bytes32 atKey, bytes32 val) = at(map._inner, index);
+ return (${fromBytes32(keyType, 'atKey')}, ${fromBytes32(valueType, 'val')});
+}
+
+/**
+ * @dev Tries to returns the value associated with \`key\`. O(1).
+ * Does not revert if \`key\` is not in the map.
+ */
+function tryGet(${name} storage map, ${keyType} key) internal view returns (bool exists, ${valueType} value) {
+ (bool success, bytes32 val) = tryGet(map._inner, ${toBytes32(keyType, 'key')});
+ return (success, ${fromBytes32(valueType, 'val')});
+}
+
+/**
+ * @dev Returns the value associated with \`key\`. O(1).
+ *
+ * Requirements:
+ *
+ * - \`key\` must be in the map.
+ */
+function get(${name} storage map, ${keyType} key) internal view returns (${valueType}) {
+ return ${fromBytes32(valueType, `get(map._inner, ${toBytes32(keyType, 'key')})`)};
+}
+
+/**
+ * @dev Return the an array containing all the keys
+ *
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
+ * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
+ */
+function keys(${name} storage map) internal view returns (${keyType}[] memory) {
+ bytes32[] memory store = keys(map._inner);
+ ${keyType}[] memory result;
+
+ assembly ("memory-safe") {
+ result := store
+ }
+
+ return result;
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library EnumerableMap {',
+ format(
+ [].concat(
+ 'using EnumerableSet for EnumerableSet.Bytes32Set;',
+ '',
+ defaultMap,
+ TYPES.map(details => customMap(details)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.opts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.opts.js
new file mode 100644
index 000000000..d26ab05b2
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.opts.js
@@ -0,0 +1,19 @@
+const { capitalize } = require('../../helpers');
+
+const mapType = str => (str == 'uint256' ? 'Uint' : capitalize(str));
+
+const formatType = (keyType, valueType) => ({
+ name: `${mapType(keyType)}To${mapType(valueType)}Map`,
+ keyType,
+ valueType,
+});
+
+const TYPES = ['uint256', 'address', 'bytes32']
+ .flatMap((key, _, array) => array.map(value => [key, value]))
+ .slice(0, -1) // remove bytes32 → byte32 (last one) that is already defined
+ .map(args => formatType(...args));
+
+module.exports = {
+ TYPES,
+ formatType,
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js
new file mode 100644
index 000000000..02eccd0df
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js
@@ -0,0 +1,247 @@
+const format = require('../format-lines');
+const { fromBytes32, toBytes32 } = require('./conversion');
+const { TYPES } = require('./EnumerableSet.opts');
+
+const header = `\
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Library for managing
+ * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
+ * types.
+ *
+ * Sets have the following properties:
+ *
+ * - Elements are added, removed, and checked for existence in constant time
+ * (O(1)).
+ * - Elements are enumerated in O(n). No guarantees are made on the ordering.
+ *
+ * \`\`\`solidity
+ * contract Example {
+ * // Add the library methods
+ * using EnumerableSet for EnumerableSet.AddressSet;
+ *
+ * // Declare a set state variable
+ * EnumerableSet.AddressSet private mySet;
+ * }
+ * \`\`\`
+ *
+ * As of v3.3.0, sets of type \`bytes32\` (\`Bytes32Set\`), \`address\` (\`AddressSet\`)
+ * and \`uint256\` (\`UintSet\`) are supported.
+ *
+ * [WARNING]
+ * ====
+ * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
+ * unusable.
+ * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
+ *
+ * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
+ * array of EnumerableSet.
+ * ====
+ */
+`;
+
+const defaultSet = `\
+// To implement this library for multiple types with as little code
+// repetition as possible, we write it in terms of a generic Set type with
+// bytes32 values.
+// The Set implementation uses private functions, and user-facing
+// implementations (such as AddressSet) are just wrappers around the
+// underlying Set.
+// This means that we can only create new EnumerableSets for types that fit
+// in bytes32.
+
+struct Set {
+ // Storage of set values
+ bytes32[] _values;
+ // Position is the index of the value in the \`values\` array plus 1.
+ // Position 0 is used to mean a value is not in the set.
+ mapping(bytes32 value => uint256) _positions;
+}
+
+/**
+ * @dev Add a value to a set. O(1).
+ *
+ * Returns true if the value was added to the set, that is if it was not
+ * already present.
+ */
+function _add(Set storage set, bytes32 value) private returns (bool) {
+ if (!_contains(set, value)) {
+ set._values.push(value);
+ // The value is stored at length-1, but we add 1 to all indexes
+ // and use 0 as a sentinel value
+ set._positions[value] = set._values.length;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * @dev Removes a value from a set. O(1).
+ *
+ * Returns true if the value was removed from the set, that is if it was
+ * present.
+ */
+function _remove(Set storage set, bytes32 value) private returns (bool) {
+ // We cache the value's position to prevent multiple reads from the same storage slot
+ uint256 position = set._positions[value];
+
+ if (position != 0) {
+ // Equivalent to contains(set, value)
+ // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
+ // the array, and then remove the last element (sometimes called as 'swap and pop').
+ // This modifies the order of the array, as noted in {at}.
+
+ uint256 valueIndex = position - 1;
+ uint256 lastIndex = set._values.length - 1;
+
+ if (valueIndex != lastIndex) {
+ bytes32 lastValue = set._values[lastIndex];
+
+ // Move the lastValue to the index where the value to delete is
+ set._values[valueIndex] = lastValue;
+ // Update the tracked position of the lastValue (that was just moved)
+ set._positions[lastValue] = position;
+ }
+
+ // Delete the slot where the moved value was stored
+ set._values.pop();
+
+ // Delete the tracked position for the deleted slot
+ delete set._positions[value];
+
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * @dev Returns true if the value is in the set. O(1).
+ */
+function _contains(Set storage set, bytes32 value) private view returns (bool) {
+ return set._positions[value] != 0;
+}
+
+/**
+ * @dev Returns the number of values on the set. O(1).
+ */
+function _length(Set storage set) private view returns (uint256) {
+ return set._values.length;
+}
+
+/**
+ * @dev Returns the value stored at position \`index\` in the set. O(1).
+ *
+ * Note that there are no guarantees on the ordering of values inside the
+ * array, and it may change when more values are added or removed.
+ *
+ * Requirements:
+ *
+ * - \`index\` must be strictly less than {length}.
+ */
+function _at(Set storage set, uint256 index) private view returns (bytes32) {
+ return set._values[index];
+}
+
+/**
+ * @dev Return the entire set in an array
+ *
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
+ * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
+ */
+function _values(Set storage set) private view returns (bytes32[] memory) {
+ return set._values;
+}
+`;
+
+const customSet = ({ name, type }) => `\
+// ${name}
+
+struct ${name} {
+ Set _inner;
+}
+
+/**
+ * @dev Add a value to a set. O(1).
+ *
+ * Returns true if the value was added to the set, that is if it was not
+ * already present.
+ */
+function add(${name} storage set, ${type} value) internal returns (bool) {
+ return _add(set._inner, ${toBytes32(type, 'value')});
+}
+
+/**
+ * @dev Removes a value from a set. O(1).
+ *
+ * Returns true if the value was removed from the set, that is if it was
+ * present.
+ */
+function remove(${name} storage set, ${type} value) internal returns (bool) {
+ return _remove(set._inner, ${toBytes32(type, 'value')});
+}
+
+/**
+ * @dev Returns true if the value is in the set. O(1).
+ */
+function contains(${name} storage set, ${type} value) internal view returns (bool) {
+ return _contains(set._inner, ${toBytes32(type, 'value')});
+}
+
+/**
+ * @dev Returns the number of values in the set. O(1).
+ */
+function length(${name} storage set) internal view returns (uint256) {
+ return _length(set._inner);
+}
+
+/**
+ * @dev Returns the value stored at position \`index\` in the set. O(1).
+ *
+ * Note that there are no guarantees on the ordering of values inside the
+ * array, and it may change when more values are added or removed.
+ *
+ * Requirements:
+ *
+ * - \`index\` must be strictly less than {length}.
+ */
+function at(${name} storage set, uint256 index) internal view returns (${type}) {
+ return ${fromBytes32(type, '_at(set._inner, index)')};
+}
+
+/**
+ * @dev Return the entire set in an array
+ *
+ * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
+ * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
+ * this function has an unbounded cost, and using it as part of a state-changing function may render the function
+ * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
+ */
+function values(${name} storage set) internal view returns (${type}[] memory) {
+ bytes32[] memory store = _values(set._inner);
+ ${type}[] memory result;
+
+ assembly ("memory-safe") {
+ result := store
+ }
+
+ return result;
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library EnumerableSet {',
+ format(
+ [].concat(
+ defaultSet,
+ TYPES.map(details => customSet(details)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.opts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.opts.js
new file mode 100644
index 000000000..739f0acdf
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.opts.js
@@ -0,0 +1,12 @@
+const { capitalize } = require('../../helpers');
+
+const mapType = str => (str == 'uint256' ? 'Uint' : capitalize(str));
+
+const formatType = type => ({
+ name: `${mapType(type)}Set`,
+ type,
+});
+
+const TYPES = ['bytes32', 'address', 'uint256'].map(formatType);
+
+module.exports = { TYPES, formatType };
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.js
new file mode 100644
index 000000000..890b2feba
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.js
@@ -0,0 +1,187 @@
+const format = require('../format-lines');
+const { OPTS } = require('./MerkleProof.opts');
+
+const DEFAULT_HASH = 'Hashes.commutativeKeccak256';
+
+const formatArgsSingleLine = (...args) => args.filter(Boolean).join(', ');
+const formatArgsMultiline = (...args) => '\n' + format(args.filter(Boolean).join(',\0').split('\0'));
+
+// TEMPLATE
+const header = `\
+pragma solidity ^0.8.20;
+
+import {Hashes} from "./Hashes.sol";
+
+/**
+ * @dev These functions deal with verification of Merkle Tree proofs.
+ *
+ * The tree and the proofs can be generated using our
+ * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
+ * You will find a quickstart guide in the readme.
+ *
+ * WARNING: You should avoid using leaf values that are 64 bytes long prior to
+ * hashing, or use a hash function other than keccak256 for hashing leaves.
+ * This is because the concatenation of a sorted pair of internal nodes in
+ * the Merkle tree could be reinterpreted as a leaf value.
+ * OpenZeppelin's JavaScript library generates Merkle trees that are safe
+ * against this attack out of the box.
+ *
+ * IMPORTANT: Consider memory side-effects when using custom hashing functions
+ * that access memory in an unsafe way.
+ *
+ * NOTE: This library supports proof verification for merkle trees built using
+ * custom _commutative_ hashing functions (i.e. \`H(a, b) == H(b, a)\`). Proving
+ * leaf inclusion in trees built using non-commutative hashing functions requires
+ * additional logic that is not supported by this library.
+ */
+`;
+
+const errors = `\
+/**
+ *@dev The multiproof provided is not valid.
+ */
+error MerkleProofInvalidMultiproof();
+`;
+
+const templateProof = ({ suffix, location, visibility, hash }) => `\
+/**
+ * @dev Returns true if a \`leaf\` can be proved to be a part of a Merkle tree
+ * defined by \`root\`. For this, a \`proof\` must be provided, containing
+ * sibling hashes on the branch from the leaf to the root of the tree. Each
+ * pair of leaves and each pair of pre-images are assumed to be sorted.
+ *
+ * This version handles proofs in ${location} with ${hash ? 'a custom' : 'the default'} hashing function.
+ */
+function verify${suffix}(${(hash ? formatArgsMultiline : formatArgsSingleLine)(
+ `bytes32[] ${location} proof`,
+ 'bytes32 root',
+ 'bytes32 leaf',
+ hash && `function(bytes32, bytes32) view returns (bytes32) ${hash}`,
+)}) internal ${visibility} returns (bool) {
+ return processProof${suffix}(proof, leaf${hash ? `, ${hash}` : ''}) == root;
+}
+
+/**
+ * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
+ * from \`leaf\` using \`proof\`. A \`proof\` is valid if and only if the rebuilt
+ * hash matches the root of the tree. When processing the proof, the pairs
+ * of leaves & pre-images are assumed to be sorted.
+ *
+ * This version handles proofs in ${location} with ${hash ? 'a custom' : 'the default'} hashing function.
+ */
+function processProof${suffix}(${(hash ? formatArgsMultiline : formatArgsSingleLine)(
+ `bytes32[] ${location} proof`,
+ 'bytes32 leaf',
+ hash && `function(bytes32, bytes32) view returns (bytes32) ${hash}`,
+)}) internal ${visibility} returns (bytes32) {
+ bytes32 computedHash = leaf;
+ for (uint256 i = 0; i < proof.length; i++) {
+ computedHash = ${hash ?? DEFAULT_HASH}(computedHash, proof[i]);
+ }
+ return computedHash;
+}
+`;
+
+const templateMultiProof = ({ suffix, location, visibility, hash }) => `\
+/**
+ * @dev Returns true if the \`leaves\` can be simultaneously proven to be a part of a Merkle tree defined by
+ * \`root\`, according to \`proof\` and \`proofFlags\` as described in {processMultiProof}.
+ *
+ * This version handles multiproofs in ${location} with ${hash ? 'a custom' : 'the default'} hashing function.
+ *
+ * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
+ *
+ * NOTE: Consider the case where \`root == proof[0] && leaves.length == 0\` as it will return \`true\`.
+ * The \`leaves\` must be validated independently. See {processMultiProof${suffix}}.
+ */
+function multiProofVerify${suffix}(${formatArgsMultiline(
+ `bytes32[] ${location} proof`,
+ `bool[] ${location} proofFlags`,
+ 'bytes32 root',
+ `bytes32[] memory leaves`,
+ hash && `function(bytes32, bytes32) view returns (bytes32) ${hash}`,
+)}) internal ${visibility} returns (bool) {
+ return processMultiProof${suffix}(proof, proofFlags, leaves${hash ? `, ${hash}` : ''}) == root;
+}
+
+/**
+ * @dev Returns the root of a tree reconstructed from \`leaves\` and sibling nodes in \`proof\`. The reconstruction
+ * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
+ * leaf/inner node or a proof sibling node, depending on whether each \`proofFlags\` item is true or false
+ * respectively.
+ *
+ * This version handles multiproofs in ${location} with ${hash ? 'a custom' : 'the default'} hashing function.
+ *
+ * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
+ * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
+ * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
+ *
+ * NOTE: The _empty set_ (i.e. the case where \`proof.length == 1 && leaves.length == 0\`) is considered a no-op,
+ * and therefore a valid multiproof (i.e. it returns \`proof[0]\`). Consider disallowing this case if you're not
+ * validating the leaves elsewhere.
+ */
+function processMultiProof${suffix}(${formatArgsMultiline(
+ `bytes32[] ${location} proof`,
+ `bool[] ${location} proofFlags`,
+ `bytes32[] memory leaves`,
+ hash && `function(bytes32, bytes32) view returns (bytes32) ${hash}`,
+)}) internal ${visibility} returns (bytes32 merkleRoot) {
+ // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
+ // consuming and producing values on a queue. The queue starts with the \`leaves\` array, then goes onto the
+ // \`hashes\` array. At the end of the process, the last hash in the \`hashes\` array should contain the root of
+ // the Merkle tree.
+ uint256 leavesLen = leaves.length;
+ uint256 proofFlagsLen = proofFlags.length;
+
+ // Check proof validity.
+ if (leavesLen + proof.length != proofFlagsLen + 1) {
+ revert MerkleProofInvalidMultiproof();
+ }
+
+ // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
+ // \`xxx[xxxPos++]\`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
+ bytes32[] memory hashes = new bytes32[](proofFlagsLen);
+ uint256 leafPos = 0;
+ uint256 hashPos = 0;
+ uint256 proofPos = 0;
+ // At each step, we compute the next hash using two values:
+ // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
+ // get the next hash.
+ // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
+ // \`proof\` array.
+ for (uint256 i = 0; i < proofFlagsLen; i++) {
+ bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
+ bytes32 b = proofFlags[i]
+ ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
+ : proof[proofPos++];
+ hashes[i] = ${hash ?? DEFAULT_HASH}(a, b);
+ }
+
+ if (proofFlagsLen > 0) {
+ if (proofPos != proof.length) {
+ revert MerkleProofInvalidMultiproof();
+ }
+ unchecked {
+ return hashes[proofFlagsLen - 1];
+ }
+ } else if (leavesLen > 0) {
+ return leaves[0];
+ } else {
+ return proof[0];
+ }
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library MerkleProof {',
+ format(
+ [].concat(
+ errors,
+ OPTS.flatMap(opts => templateProof(opts)),
+ OPTS.flatMap(opts => templateMultiProof(opts)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.opts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.opts.js
new file mode 100644
index 000000000..911f23922
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.opts.js
@@ -0,0 +1,11 @@
+const { product } = require('../../helpers');
+
+const OPTS = product(
+ [
+ { suffix: '', location: 'memory' },
+ { suffix: 'Calldata', location: 'calldata' },
+ ],
+ [{ visibility: 'pure' }, { visibility: 'view', hash: 'hasher' }],
+).map(objs => Object.assign({}, ...objs));
+
+module.exports = { OPTS };
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.js
new file mode 100644
index 000000000..9f3b7716a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.js
@@ -0,0 +1,92 @@
+const format = require('../format-lines');
+const sanitize = require('../helpers/sanitize');
+const { product } = require('../../helpers');
+const { SIZES } = require('./Packing.opts');
+
+// TEMPLATE
+const header = `\
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Helper library packing and unpacking multiple values into bytesXX.
+ *
+ * Example usage:
+ *
+ * \`\`\`solidity
+ * library MyPacker {
+ * type MyType is bytes32;
+ *
+ * function _pack(address account, bytes4 selector, uint64 period) external pure returns (MyType) {
+ * bytes12 subpack = Packing.pack_4_8(selector, bytes8(period));
+ * bytes32 pack = Packing.pack_20_12(bytes20(account), subpack);
+ * return MyType.wrap(pack);
+ * }
+ *
+ * function _unpack(MyType self) external pure returns (address, bytes4, uint64) {
+ * bytes32 pack = MyType.unwrap(self);
+ * return (
+ * address(Packing.extract_32_20(pack, 0)),
+ * Packing.extract_32_4(pack, 20),
+ * uint64(Packing.extract_32_8(pack, 24))
+ * );
+ * }
+ * }
+ * \`\`\`
+ *
+ * _Available since v5.1._
+ */
+// solhint-disable func-name-mixedcase
+`;
+
+const errors = `\
+error OutOfRangeAccess();
+`;
+
+const pack = (left, right) => `\
+function pack_${left}_${right}(bytes${left} left, bytes${right} right) internal pure returns (bytes${
+ left + right
+} result) {
+ assembly ("memory-safe") {
+ left := ${sanitize.bytes('left', left)}
+ right := ${sanitize.bytes('right', right)}
+ result := or(left, shr(${8 * left}, right))
+ }
+}
+`;
+
+const extract = (outer, inner) => `\
+function extract_${outer}_${inner}(bytes${outer} self, uint8 offset) internal pure returns (bytes${inner} result) {
+ if (offset > ${outer - inner}) revert OutOfRangeAccess();
+ assembly ("memory-safe") {
+ result := ${sanitize.bytes('shl(mul(8, offset), self)', inner)}
+ }
+}
+`;
+
+const replace = (outer, inner) => `\
+function replace_${outer}_${inner}(bytes${outer} self, bytes${inner} value, uint8 offset) internal pure returns (bytes${outer} result) {
+ bytes${inner} oldValue = extract_${outer}_${inner}(self, offset);
+ assembly ("memory-safe") {
+ value := ${sanitize.bytes('value', inner)}
+ result := xor(self, shr(mul(8, offset), xor(oldValue, value)))
+ }
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library Packing {',
+ format(
+ [].concat(
+ errors,
+ product(SIZES, SIZES)
+ .filter(([left, right]) => SIZES.includes(left + right))
+ .map(([left, right]) => pack(left, right)),
+ product(SIZES, SIZES)
+ .filter(([outer, inner]) => outer > inner)
+ .flatMap(([outer, inner]) => [extract(outer, inner), replace(outer, inner)]),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.opts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.opts.js
new file mode 100644
index 000000000..893ad6297
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.opts.js
@@ -0,0 +1,3 @@
+module.exports = {
+ SIZES: [1, 2, 4, 6, 8, 10, 12, 16, 20, 22, 24, 28, 32],
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.t.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.t.js
new file mode 100644
index 000000000..1feec28f5
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.t.js
@@ -0,0 +1,48 @@
+const format = require('../format-lines');
+const { product } = require('../../helpers');
+const { SIZES } = require('./Packing.opts');
+
+// TEMPLATE
+const header = `\
+pragma solidity ^0.8.20;
+
+import {Test} from "forge-std/Test.sol";
+import {Packing} from "@openzeppelin/contracts/utils/Packing.sol";
+`;
+
+const testPack = (left, right) => `\
+function testPack(bytes${left} left, bytes${right} right) external pure {
+ assertEq(left, Packing.pack_${left}_${right}(left, right).extract_${left + right}_${left}(0));
+ assertEq(right, Packing.pack_${left}_${right}(left, right).extract_${left + right}_${right}(${left}));
+}
+`;
+
+const testReplace = (outer, inner) => `\
+function testReplace(bytes${outer} container, bytes${inner} newValue, uint8 offset) external pure {
+ offset = uint8(bound(offset, 0, ${outer - inner}));
+
+ bytes${inner} oldValue = container.extract_${outer}_${inner}(offset);
+
+ assertEq(newValue, container.replace_${outer}_${inner}(newValue, offset).extract_${outer}_${inner}(offset));
+ assertEq(container, container.replace_${outer}_${inner}(newValue, offset).replace_${outer}_${inner}(oldValue, offset));
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header,
+ 'contract PackingTest is Test {',
+ format(
+ [].concat(
+ 'using Packing for *;',
+ '',
+ product(SIZES, SIZES)
+ .filter(([left, right]) => SIZES.includes(left + right))
+ .map(([left, right]) => testPack(left, right)),
+ product(SIZES, SIZES)
+ .filter(([outer, inner]) => outer > inner)
+ .map(([outer, inner]) => testReplace(outer, inner)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js
new file mode 100644
index 000000000..21000cf4a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js
@@ -0,0 +1,136 @@
+const format = require('../format-lines');
+const { range } = require('../../helpers');
+
+const LENGTHS = range(8, 256, 8).reverse(); // 248 → 8 (in steps of 8)
+
+const header = `\
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow
+ * checks.
+ *
+ * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
+ * easily result in undesired exploitation or bugs, since developers usually
+ * assume that overflows raise errors. \`SafeCast\` restores this intuition by
+ * reverting the transaction when such an operation overflows.
+ *
+ * Using this library instead of the unchecked operations eliminates an entire
+ * class of bugs, so it's recommended to use it always.
+ */
+`;
+
+const errors = `\
+/**
+ * @dev Value doesn't fit in an uint of \`bits\` size.
+ */
+error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
+
+/**
+ * @dev An int value doesn't fit in an uint of \`bits\` size.
+ */
+error SafeCastOverflowedIntToUint(int256 value);
+
+/**
+ * @dev Value doesn't fit in an int of \`bits\` size.
+ */
+error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);
+
+/**
+ * @dev An uint value doesn't fit in an int of \`bits\` size.
+ */
+error SafeCastOverflowedUintToInt(uint256 value);
+`;
+
+const toUintDownCast = length => `\
+/**
+ * @dev Returns the downcasted uint${length} from uint256, reverting on
+ * overflow (when the input is greater than largest uint${length}).
+ *
+ * Counterpart to Solidity's \`uint${length}\` operator.
+ *
+ * Requirements:
+ *
+ * - input must fit into ${length} bits
+ */
+function toUint${length}(uint256 value) internal pure returns (uint${length}) {
+ if (value > type(uint${length}).max) {
+ revert SafeCastOverflowedUintDowncast(${length}, value);
+ }
+ return uint${length}(value);
+}
+`;
+
+const toIntDownCast = length => `\
+/**
+ * @dev Returns the downcasted int${length} from int256, reverting on
+ * overflow (when the input is less than smallest int${length} or
+ * greater than largest int${length}).
+ *
+ * Counterpart to Solidity's \`int${length}\` operator.
+ *
+ * Requirements:
+ *
+ * - input must fit into ${length} bits
+ */
+function toInt${length}(int256 value) internal pure returns (int${length} downcasted) {
+ downcasted = int${length}(value);
+ if (downcasted != value) {
+ revert SafeCastOverflowedIntDowncast(${length}, value);
+ }
+}
+`;
+
+const toInt = length => `\
+/**
+ * @dev Converts an unsigned uint${length} into a signed int${length}.
+ *
+ * Requirements:
+ *
+ * - input must be less than or equal to maxInt${length}.
+ */
+function toInt${length}(uint${length} value) internal pure returns (int${length}) {
+ // Note: Unsafe cast below is okay because \`type(int${length}).max\` is guaranteed to be positive
+ if (value > uint${length}(type(int${length}).max)) {
+ revert SafeCastOverflowedUintToInt(value);
+ }
+ return int${length}(value);
+}
+`;
+
+const toUint = length => `\
+/**
+ * @dev Converts a signed int${length} into an unsigned uint${length}.
+ *
+ * Requirements:
+ *
+ * - input must be greater than or equal to 0.
+ */
+function toUint${length}(int${length} value) internal pure returns (uint${length}) {
+ if (value < 0) {
+ revert SafeCastOverflowedIntToUint(value);
+ }
+ return uint${length}(value);
+}
+`;
+
+const boolToUint = `\
+/**
+ * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.
+ */
+function toUint(bool b) internal pure returns (uint256 u) {
+ assembly ("memory-safe") {
+ u := iszero(iszero(b))
+ }
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library SafeCast {',
+ format(
+ [].concat(errors, LENGTHS.map(toUintDownCast), toUint(256), LENGTHS.map(toIntDownCast), toInt(256), boolToUint),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Slot.opts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Slot.opts.js
new file mode 100644
index 000000000..3eca2bcf0
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Slot.opts.js
@@ -0,0 +1,15 @@
+const { capitalize } = require('../../helpers');
+
+const TYPES = [
+ { type: 'address', isValueType: true },
+ { type: 'bool', isValueType: true, name: 'Boolean' },
+ { type: 'bytes32', isValueType: true, variants: ['bytes4'] },
+ { type: 'uint256', isValueType: true, variants: ['uint32'] },
+ { type: 'int256', isValueType: true, variants: ['int32'] },
+ { type: 'string', isValueType: false },
+ { type: 'bytes', isValueType: false },
+].map(type => Object.assign(type, { name: type.name ?? capitalize(type.type) }));
+
+Object.assign(TYPES, Object.fromEntries(TYPES.map(entry => [entry.type, entry])));
+
+module.exports = { TYPES };
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.js
new file mode 100644
index 000000000..ec4d244b9
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.js
@@ -0,0 +1,119 @@
+const format = require('../format-lines');
+const sanitize = require('../helpers/sanitize');
+const { TYPES } = require('./Slot.opts');
+
+const header = `\
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Library for computing storage (and transient storage) locations from namespaces and deriving slots
+ * corresponding to standard patterns. The derivation method for array and mapping matches the storage layout used by
+ * the solidity language / compiler.
+ *
+ * See https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays[Solidity docs for mappings and dynamic arrays.].
+ *
+ * Example usage:
+ * \`\`\`solidity
+ * contract Example {
+ * // Add the library methods
+ * using StorageSlot for bytes32;
+ * using SlotDerivation for bytes32;
+ *
+ * // Declare a namespace
+ * string private constant _NAMESPACE = "" // eg. OpenZeppelin.Slot
+ *
+ * function setValueInNamespace(uint256 key, address newValue) internal {
+ * _NAMESPACE.erc7201Slot().deriveMapping(key).getAddressSlot().value = newValue;
+ * }
+ *
+ * function getValueInNamespace(uint256 key) internal view returns (address) {
+ * return _NAMESPACE.erc7201Slot().deriveMapping(key).getAddressSlot().value;
+ * }
+ * }
+ * \`\`\`
+ *
+ * TIP: Consider using this library along with {StorageSlot}.
+ *
+ * NOTE: This library provides a way to manipulate storage locations in a non-standard way. Tooling for checking
+ * upgrade safety will ignore the slots accessed through this library.
+ *
+ * _Available since v5.1._
+ */
+`;
+
+const namespace = `\
+/**
+ * @dev Derive an ERC-7201 slot from a string (namespace).
+ */
+function erc7201Slot(string memory namespace) internal pure returns (bytes32 slot) {
+ assembly ("memory-safe") {
+ mstore(0x00, sub(keccak256(add(namespace, 0x20), mload(namespace)), 1))
+ slot := and(keccak256(0x00, 0x20), not(0xff))
+ }
+}
+`;
+
+const array = `\
+/**
+ * @dev Add an offset to a slot to get the n-th element of a structure or an array.
+ */
+function offset(bytes32 slot, uint256 pos) internal pure returns (bytes32 result) {
+ unchecked {
+ return bytes32(uint256(slot) + pos);
+ }
+}
+
+/**
+ * @dev Derive the location of the first element in an array from the slot where the length is stored.
+ */
+function deriveArray(bytes32 slot) internal pure returns (bytes32 result) {
+ assembly ("memory-safe") {
+ mstore(0x00, slot)
+ result := keccak256(0x00, 0x20)
+ }
+}
+`;
+
+const mapping = ({ type }) => `\
+/**
+ * @dev Derive the location of a mapping element from the key.
+ */
+function deriveMapping(bytes32 slot, ${type} key) internal pure returns (bytes32 result) {
+ assembly ("memory-safe") {
+ mstore(0x00, ${(sanitize[type] ?? (x => x))('key')})
+ mstore(0x20, slot)
+ result := keccak256(0x00, 0x40)
+ }
+}
+`;
+
+const mapping2 = ({ type }) => `\
+/**
+ * @dev Derive the location of a mapping element from the key.
+ */
+function deriveMapping(bytes32 slot, ${type} memory key) internal pure returns (bytes32 result) {
+ assembly ("memory-safe") {
+ let length := mload(key)
+ let begin := add(key, 0x20)
+ let end := add(begin, length)
+ let cache := mload(end)
+ mstore(end, slot)
+ result := keccak256(begin, add(length, 0x20))
+ mstore(end, cache)
+ }
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library SlotDerivation {',
+ format(
+ [].concat(
+ namespace,
+ array,
+ TYPES.map(type => (type.isValueType ? mapping(type) : mapping2(type))),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.t.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.t.js
new file mode 100644
index 000000000..f03e1fc25
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.t.js
@@ -0,0 +1,127 @@
+const format = require('../format-lines');
+const { capitalize } = require('../../helpers');
+const { TYPES } = require('./Slot.opts');
+
+const header = `\
+pragma solidity ^0.8.20;
+
+import {Test} from "forge-std/Test.sol";
+import {SymTest} from "halmos-cheatcodes/SymTest.sol";
+import {SlotDerivation} from "@openzeppelin/contracts/utils/SlotDerivation.sol";
+`;
+
+const array = `\
+bytes[] private _array;
+
+function symbolicDeriveArray(uint256 length, uint256 offset) public {
+ vm.assume(length > 0);
+ vm.assume(offset < length);
+ _assertDeriveArray(length, offset);
+}
+
+function testDeriveArray(uint256 length, uint256 offset) public {
+ length = bound(length, 1, type(uint256).max);
+ offset = bound(offset, 0, length - 1);
+ _assertDeriveArray(length, offset);
+}
+
+function _assertDeriveArray(uint256 length, uint256 offset) public {
+ bytes32 baseSlot;
+ assembly {
+ baseSlot := _array.slot
+ sstore(baseSlot, length) // store length so solidity access does not revert
+ }
+
+ bytes storage derived = _array[offset];
+ bytes32 derivedSlot;
+ assembly {
+ derivedSlot := derived.slot
+ }
+
+ assertEq(baseSlot.deriveArray().offset(offset), derivedSlot);
+}
+`;
+
+const mapping = ({ type, name }) => `\
+mapping(${type} => bytes) private _${type}Mapping;
+
+function testSymbolicDeriveMapping${name}(${type} key) public {
+ bytes32 baseSlot;
+ assembly {
+ baseSlot := _${type}Mapping.slot
+ }
+
+ bytes storage derived = _${type}Mapping[key];
+ bytes32 derivedSlot;
+ assembly {
+ derivedSlot := derived.slot
+ }
+
+ assertEq(baseSlot.deriveMapping(key), derivedSlot);
+}
+`;
+
+const mappingDirty = ({ type, name }) => `\
+function testSymbolicDeriveMapping${name}Dirty(bytes32 dirtyKey) public {
+ ${type} key;
+ assembly {
+ key := dirtyKey
+ }
+
+ // run the "normal" test using a potentially dirty value
+ testSymbolicDeriveMapping${name}(key);
+}
+`;
+
+const boundedMapping = ({ type, name }) => `\
+mapping(${type} => bytes) private _${type}Mapping;
+
+function testDeriveMapping${name}(${type} memory key) public {
+ _assertDeriveMapping${name}(key);
+}
+
+function symbolicDeriveMapping${name}() public {
+ _assertDeriveMapping${name}(svm.create${name}(256, "DeriveMapping${name}Input"));
+}
+
+function _assertDeriveMapping${name}(${type} memory key) internal {
+ bytes32 baseSlot;
+ assembly {
+ baseSlot := _${type}Mapping.slot
+ }
+
+ bytes storage derived = _${type}Mapping[key];
+ bytes32 derivedSlot;
+ assembly {
+ derivedSlot := derived.slot
+ }
+
+ assertEq(baseSlot.deriveMapping(key), derivedSlot);
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header,
+ 'contract SlotDerivationTest is Test, SymTest {',
+ format(
+ [].concat(
+ 'using SlotDerivation for bytes32;',
+ '',
+ array,
+ TYPES.flatMap(type =>
+ [].concat(
+ type,
+ (type.variants ?? []).map(variant => ({
+ type: variant,
+ name: capitalize(variant),
+ isValueType: type.isValueType,
+ })),
+ ),
+ ).map(type => (type.isValueType ? mapping(type) : boundedMapping(type))),
+ mappingDirty(TYPES.bool),
+ mappingDirty(TYPES.address),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js
new file mode 100644
index 000000000..53287b81f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js
@@ -0,0 +1,77 @@
+const format = require('../format-lines');
+const { TYPES } = require('./Slot.opts');
+
+const header = `\
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Library for reading and writing primitive types to specific storage slots.
+ *
+ * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
+ * This library helps with reading and writing to such slots without the need for inline assembly.
+ *
+ * The functions in this library return Slot structs that contain a \`value\` member that can be used to read or write.
+ *
+ * Example usage to set ERC-1967 implementation slot:
+ * \`\`\`solidity
+ * contract ERC1967 {
+ * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
+ * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
+ *
+ * function _getImplementation() internal view returns (address) {
+ * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
+ * }
+ *
+ * function _setImplementation(address newImplementation) internal {
+ * require(newImplementation.code.length > 0);
+ * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
+ * }
+ * }
+ * \`\`\`
+ *
+ * TIP: Consider using this library along with {SlotDerivation}.
+ */
+`;
+
+const struct = ({ type, name }) => `\
+struct ${name}Slot {
+ ${type} value;
+}
+`;
+
+const get = ({ name }) => `\
+/**
+ * @dev Returns ${
+ name.toLowerCase().startsWith('a') ? 'an' : 'a'
+ } \`${name}Slot\` with member \`value\` located at \`slot\`.
+ */
+function get${name}Slot(bytes32 slot) internal pure returns (${name}Slot storage r) {
+ assembly ("memory-safe") {
+ r.slot := slot
+ }
+}
+`;
+
+const getStorage = ({ type, name }) => `\
+/**
+ * @dev Returns an \`${name}Slot\` representation of the ${type} storage pointer \`store\`.
+ */
+function get${name}Slot(${type} storage store) internal pure returns (${name}Slot storage r) {
+ assembly ("memory-safe") {
+ r.slot := store.slot
+ }
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library StorageSlot {',
+ format(
+ [].concat(
+ TYPES.map(type => struct(type)),
+ TYPES.flatMap(type => [get(type), !type.isValueType && getStorage(type)].filter(Boolean)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlotMock.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlotMock.js
new file mode 100644
index 000000000..c6d326a5e
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlotMock.js
@@ -0,0 +1,57 @@
+const format = require('../format-lines');
+const { TYPES } = require('./Slot.opts');
+
+const header = `\
+pragma solidity ^0.8.20;
+
+import {Multicall} from "../utils/Multicall.sol";
+import {StorageSlot} from "../utils/StorageSlot.sol";
+`;
+
+const storageSetValueType = ({ type, name }) => `\
+function set${name}Slot(bytes32 slot, ${type} value) public {
+ slot.get${name}Slot().value = value;
+}
+`;
+
+const storageGetValueType = ({ type, name }) => `\
+function get${name}Slot(bytes32 slot) public view returns (${type}) {
+ return slot.get${name}Slot().value;
+}
+`;
+
+const storageSetNonValueType = ({ type, name }) => `\
+mapping(uint256 key => ${type}) public ${type}Map;
+
+function set${name}Slot(bytes32 slot, ${type} calldata value) public {
+ slot.get${name}Slot().value = value;
+}
+
+function set${name}Storage(uint256 key, ${type} calldata value) public {
+ ${type}Map[key].get${name}Slot().value = value;
+}
+
+function get${name}Slot(bytes32 slot) public view returns (${type} memory) {
+ return slot.get${name}Slot().value;
+}
+
+function get${name}Storage(uint256 key) public view returns (${type} memory) {
+ return ${type}Map[key].get${name}Slot().value;
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header,
+ 'contract StorageSlotMock is Multicall {',
+ format(
+ [].concat(
+ 'using StorageSlot for *;',
+ '',
+ TYPES.filter(type => type.isValueType).map(type => storageSetValueType(type)),
+ TYPES.filter(type => type.isValueType).map(type => storageGetValueType(type)),
+ TYPES.filter(type => !type.isValueType).map(type => storageSetNonValueType(type)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlot.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlot.js
new file mode 100644
index 000000000..8e291bc13
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlot.js
@@ -0,0 +1,80 @@
+const format = require('../format-lines');
+const { TYPES } = require('./Slot.opts');
+
+const header = `\
+pragma solidity ^0.8.24;
+
+/**
+ * @dev Library for reading and writing value-types to specific transient storage slots.
+ *
+ * Transient slots are often used to store temporary values that are removed after the current transaction.
+ * This library helps with reading and writing to such slots without the need for inline assembly.
+ *
+ * * Example reading and writing values using transient storage:
+ * \`\`\`solidity
+ * contract Lock {
+ * using TransientSlot for *;
+ *
+ * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
+ * bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542;
+ *
+ * modifier locked() {
+ * require(!_LOCK_SLOT.asBoolean().tload());
+ *
+ * _LOCK_SLOT.asBoolean().tstore(true);
+ * _;
+ * _LOCK_SLOT.asBoolean().tstore(false);
+ * }
+ * }
+ * \`\`\`
+ *
+ * TIP: Consider using this library along with {SlotDerivation}.
+ */
+`;
+
+const udvt = ({ type, name }) => `\
+/**
+ * @dev UDVT that represent a slot holding a ${type}.
+ */
+type ${name}Slot is bytes32;
+
+/**
+ * @dev Cast an arbitrary slot to a ${name}Slot.
+ */
+function as${name}(bytes32 slot) internal pure returns (${name}Slot) {
+ return ${name}Slot.wrap(slot);
+}
+`;
+
+const transient = ({ type, name }) => `\
+/**
+ * @dev Load the value held at location \`slot\` in transient storage.
+ */
+function tload(${name}Slot slot) internal view returns (${type} value) {
+ assembly ("memory-safe") {
+ value := tload(slot)
+ }
+}
+
+/**
+ * @dev Store \`value\` at location \`slot\` in transient storage.
+ */
+function tstore(${name}Slot slot, ${type} value) internal {
+ assembly ("memory-safe") {
+ tstore(slot, value)
+ }
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header.trimEnd(),
+ 'library TransientSlot {',
+ format(
+ [].concat(
+ TYPES.filter(type => type.isValueType).map(type => udvt(type)),
+ TYPES.filter(type => type.isValueType).map(type => transient(type)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlotMock.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlotMock.js
new file mode 100644
index 000000000..4807b0cc1
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlotMock.js
@@ -0,0 +1,35 @@
+const format = require('../format-lines');
+const { TYPES } = require('./Slot.opts');
+
+const header = `\
+pragma solidity ^0.8.24;
+
+import {Multicall} from "../utils/Multicall.sol";
+import {TransientSlot} from "../utils/TransientSlot.sol";
+`;
+
+const transient = ({ type, name }) => `\
+event ${name}Value(bytes32 slot, ${type} value);
+
+function tload${name}(bytes32 slot) public {
+ emit ${name}Value(slot, slot.as${name}().tload());
+}
+
+function tstore(bytes32 slot, ${type} value) public {
+ slot.as${name}().tstore(value);
+}
+`;
+
+// GENERATE
+module.exports = format(
+ header,
+ 'contract TransientSlotMock is Multicall {',
+ format(
+ [].concat(
+ 'using TransientSlot for *;',
+ '',
+ TYPES.filter(type => type.isValueType).map(type => transient(type)),
+ ),
+ ).trimEnd(),
+ '}',
+);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js
new file mode 100644
index 000000000..9221f7c21
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js
@@ -0,0 +1,30 @@
+function toBytes32(type, value) {
+ switch (type) {
+ case 'bytes32':
+ return value;
+ case 'uint256':
+ return `bytes32(${value})`;
+ case 'address':
+ return `bytes32(uint256(uint160(${value})))`;
+ default:
+ throw new Error(`Conversion from ${type} to bytes32 not supported`);
+ }
+}
+
+function fromBytes32(type, value) {
+ switch (type) {
+ case 'bytes32':
+ return value;
+ case 'uint256':
+ return `uint256(${value})`;
+ case 'address':
+ return `address(uint160(uint256(${value})))`;
+ default:
+ throw new Error(`Conversion from bytes32 to ${type} not supported`);
+ }
+}
+
+module.exports = {
+ toBytes32,
+ fromBytes32,
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/git-user-config.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/git-user-config.sh
new file mode 100644
index 000000000..e7b81c3eb
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/git-user-config.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+set -euo pipefail -x
+
+git config user.name 'github-actions'
+git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/helpers.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/helpers.js
new file mode 100644
index 000000000..d28c0866d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/helpers.js
@@ -0,0 +1,7 @@
+const iterate = require('../test/helpers/iterate');
+const strings = require('../test/helpers/strings');
+
+module.exports = {
+ ...iterate,
+ ...strings,
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepack.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepack.sh
new file mode 100644
index 000000000..6af10329f
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepack.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+shopt -s globstar
+
+# cross platform `mkdir -p`
+mkdirp() {
+ node -e "fs.mkdirSync('$1', { recursive: true })"
+}
+
+# cd to the root of the repo
+cd "$(git rev-parse --show-toplevel)"
+
+npm run clean
+
+env COMPILE_MODE=production npm run compile
+
+mkdirp contracts/build/contracts
+cp artifacts/contracts/**/*.json contracts/build/contracts
+rm contracts/build/contracts/*.dbg.json
+node scripts/remove-ignored-artifacts.js
+
+cp README.md contracts/
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepare-docs.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepare-docs.sh
new file mode 100644
index 000000000..d1317b092
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepare-docs.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+shopt -s globstar
+
+OUTDIR="$(node -p 'require("./docs/config.js").outputDir')"
+
+if [ ! -d node_modules ]; then
+ npm ci
+fi
+
+rm -rf "$OUTDIR"
+
+hardhat docgen
+
+# copy examples and adjust imports
+examples_source_dir="contracts/mocks/docs"
+examples_target_dir="docs/modules/api/examples"
+
+for f in "$examples_source_dir"/**/*.sol; do
+ name="${f/#"$examples_source_dir/"/}"
+ mkdir -p "$examples_target_dir/$(dirname "$name")"
+ sed -Ee '/^import/s|"(\.\./)+|"@openzeppelin/contracts/|' "$f" > "$examples_target_dir/$name"
+done
+
+node scripts/gen-nav.js "$OUTDIR" > "$OUTDIR/../nav.adoc"
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepare.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepare.sh
new file mode 100644
index 000000000..a7d74227d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepare.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+if git status &>/dev/null; then git config core.hooksPath .githooks; fi
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/format-changelog.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/format-changelog.js
new file mode 100644
index 000000000..b8bcc8c71
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/format-changelog.js
@@ -0,0 +1,33 @@
+#!/usr/bin/env node
+
+// Adjusts the format of the changelog that changesets generates.
+// This is run automatically when npm version is run.
+
+const fs = require('fs');
+const changelog = fs.readFileSync('CHANGELOG.md', 'utf8');
+
+// Groups:
+// - 1: Pull Request Number and URL
+// - 2: Changeset entry
+const RELEASE_LINE_REGEX = /^- (\[#.*?\]\(.*?\))?.*?! - (.*)$/gm;
+
+// Captures vX.Y.Z or vX.Y.Z-rc.W
+const VERSION_TITLE_REGEX = /^## (\d+\.\d+\.\d+(-rc\.\d+)?)$/gm;
+
+const isPrerelease = process.env.PRERELEASE === 'true';
+
+const formatted = changelog
+ // Remove titles
+ .replace(/^### Major Changes\n\n/gm, '')
+ .replace(/^### Minor Changes\n\n/gm, '')
+ .replace(/^### Patch Changes\n\n/gm, '')
+ // Remove extra whitespace between items
+ .replace(/^(- \[.*\n)\n(?=-)/gm, '$1')
+ // Format each release line
+ .replace(RELEASE_LINE_REGEX, (_, pr, entry) => (pr ? `- ${entry} (${pr})` : `- ${entry}`))
+ // Add date to new version
+ .replace(VERSION_TITLE_REGEX, `\n## $1 (${new Date().toISOString().split('T')[0]})`)
+ // Conditionally allow vX.Y.Z.rc-.W sections only in prerelease
+ .replace(/^## \d\.\d\.\d-rc\S+[^]+?(?=^#)/gm, section => (isPrerelease ? section : ''));
+
+fs.writeFileSync('CHANGELOG.md', formatted);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js
new file mode 100644
index 000000000..15aa25993
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js
@@ -0,0 +1,15 @@
+#!/usr/bin/env node
+
+// Synchronizes the version in contracts/package.json with the one in package.json.
+// This is run automatically when npm version is run.
+
+const fs = require('fs');
+
+setVersion('package.json', 'contracts/package.json');
+
+function setVersion(from, to) {
+ const fromJson = JSON.parse(fs.readFileSync(from));
+ const toJson = JSON.parse(fs.readFileSync(to));
+ toJson.version = fromJson.version;
+ fs.writeFileSync(to, JSON.stringify(toJson, null, 2) + '\n');
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/update-comment.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/update-comment.js
new file mode 100644
index 000000000..9d6df2694
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/update-comment.js
@@ -0,0 +1,34 @@
+#!/usr/bin/env node
+const fs = require('fs');
+const proc = require('child_process');
+const semver = require('semver');
+const run = (cmd, ...args) => proc.execFileSync(cmd, args, { encoding: 'utf8' }).trim();
+
+const gitStatus = run('git', 'status', '--porcelain', '-uno', 'contracts/**/*.sol');
+if (gitStatus.length > 0) {
+ console.error('Contracts directory is not clean');
+ process.exit(1);
+}
+
+const { version } = require('../../package.json');
+
+// Get latest tag according to semver.
+const [tag] = run('git', 'tag')
+ .split(/\r?\n/)
+ .filter(semver.coerce) // check version can be processed
+ .filter(v => semver.satisfies(v, `< ${version}`)) // ignores prereleases unless currently a prerelease
+ .sort(semver.rcompare);
+
+// Ordering tag → HEAD is important here.
+const files = run('git', 'diff', tag, 'HEAD', '--name-only', 'contracts/**/*.sol')
+ .split(/\r?\n/)
+ .filter(file => file && !file.match(/mock/i) && fs.existsSync(file));
+
+for (const file of files) {
+ const current = fs.readFileSync(file, 'utf8');
+ const updated = current.replace(
+ /(\/\/ SPDX-License-Identifier:.*)$(\n\/\/ OpenZeppelin Contracts .*$)?/m,
+ `$1\n// OpenZeppelin Contracts (last updated v${version}) (${file.replace('contracts/', '')})`,
+ );
+ fs.writeFileSync(file, updated);
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/version.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/version.sh
new file mode 100644
index 000000000..7b0ddead3
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/version.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+changeset version
+
+scripts/release/format-changelog.js
+scripts/release/synchronize-versions.js
+scripts/release/update-comment.js
+
+oz-docs update-version
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh
new file mode 100644
index 000000000..bcf9b9ae9
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+npx changeset pre exit rc
+git add .
+git commit -m "Exit release candidate"
+git push origin
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js
new file mode 100644
index 000000000..f213106b8
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js
@@ -0,0 +1,48 @@
+const { readFileSync } = require('fs');
+const { join } = require('path');
+const { version } = require(join(__dirname, '../../../package.json'));
+
+module.exports = async ({ github, context }) => {
+ const changelog = readFileSync('CHANGELOG.md', 'utf8');
+
+ await github.rest.repos.createRelease({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ tag_name: `v${version}`,
+ target_commitish: github.ref_name,
+ body: extractSection(changelog, version),
+ prerelease: process.env.PRERELEASE === 'true',
+ });
+};
+
+// From https://github.com/frangio/extract-changelog/blob/master/src/utils/word-regexp.ts
+function makeWordRegExp(word) {
+ const start = word.length > 0 && /\b/.test(word[0]) ? '\\b' : '';
+ const end = word.length > 0 && /\b/.test(word[word.length - 1]) ? '\\b' : '';
+ return new RegExp(start + [...word].map(c => (/[a-z0-9]/i.test(c) ? c : '\\' + c)).join('') + end);
+}
+
+// From https://github.com/frangio/extract-changelog/blob/master/src/core.ts
+function extractSection(document, wantedHeading) {
+ // ATX Headings as defined in GitHub Flavored Markdown (https://github.github.com/gfm/#atx-headings)
+ const heading = /^ {0,3}(?#{1,6})(?: [ \t\v\f]*(?.*?)[ \t\v\f]*)?(?:[\n\r]+|$)/gm;
+
+ const wantedHeadingRe = makeWordRegExp(wantedHeading);
+
+ let start, end;
+
+ for (const m of document.matchAll(heading)) {
+ if (!start) {
+ if (m.groups.text.search(wantedHeadingRe) === 0) {
+ start = m;
+ }
+ } else if (m.groups.lead.length <= start.groups.lead.length) {
+ end = m;
+ break;
+ }
+ }
+
+ if (start) {
+ return document.slice(start.index + start[0].length, end?.index);
+ }
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh
new file mode 100644
index 000000000..86e99f929
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+CHECKSUMS="$RUNNER_TEMP/checksums.txt"
+
+# Extract tarball content into a tmp directory
+tar xf "$TARBALL" -C "$RUNNER_TEMP"
+
+# Move to extracted directory
+cd "$RUNNER_TEMP/package"
+
+# Checksum all Solidity files
+find . -type f -name "*.sol" | xargs shasum > "$CHECKSUMS"
+
+# Back to directory with git contents
+cd "$GITHUB_WORKSPACE/contracts"
+
+# Check against tarball contents
+shasum -c "$CHECKSUMS"
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh
new file mode 100644
index 000000000..ce30712f8
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+dist_tag() {
+ PACKAGE_JSON_NAME="$(jq -r .name ./package.json)"
+ LATEST_NPM_VERSION="$(npm info "$PACKAGE_JSON_NAME" version)"
+ PACKAGE_JSON_VERSION="$(jq -r .version ./package.json)"
+
+ if [ "$PRERELEASE" = "true" ]; then
+ echo "next"
+ elif npx semver -r ">$LATEST_NPM_VERSION" "$PACKAGE_JSON_VERSION" > /dev/null; then
+ echo "latest"
+ else
+ # This is a patch for an older version
+ # npm can't publish without a tag
+ echo "tmp"
+ fi
+}
+
+cd contracts
+TARBALL="$(npm pack | tee /dev/stderr | tail -1)"
+echo "tarball_name=$TARBALL" >> $GITHUB_OUTPUT
+echo "tarball=$(pwd)/$TARBALL" >> $GITHUB_OUTPUT
+echo "tag=$(dist_tag)" >> $GITHUB_OUTPUT
+cd ..
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh
new file mode 100644
index 000000000..e490e5d00
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+PACKAGE_JSON_NAME="$(tar xfO "$TARBALL" package/package.json | jq -r .name)"
+PACKAGE_JSON_VERSION="$(tar xfO "$TARBALL" package/package.json | jq -r .version)"
+
+# Intentionally escape $ to avoid interpolation and writing the token to disk
+echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc
+
+# Actual publish
+npm publish "$TARBALL" --tag "$TAG"
+
+# Clean up tags
+delete_tag() {
+ npm dist-tag rm "$PACKAGE_JSON_NAME" "$1"
+}
+
+if [ "$TAG" = tmp ]; then
+ delete_tag "$TAG"
+elif [ "$TAG" = latest ]; then
+ # Delete the next tag if it exists and is a prerelease for what is currently being published
+ if npm dist-tag ls "$PACKAGE_JSON_NAME" | grep -q "next: $PACKAGE_JSON_VERSION"; then
+ delete_tag next
+ fi
+fi
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js
new file mode 100644
index 000000000..f48ce6ea2
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js
@@ -0,0 +1,7 @@
+module.exports = ({ github, context }) =>
+ github.rest.actions.createWorkflowDispatch({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ workflow_id: 'release-cycle.yml',
+ ref: process.env.REF || process.env.GITHUB_REF_NAME,
+ });
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js
new file mode 100644
index 000000000..59b03b22a
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js
@@ -0,0 +1,17 @@
+const { coerce, inc, rsort } = require('semver');
+const { join } = require('path');
+const { version } = require(join(__dirname, '../../../package.json'));
+
+module.exports = async ({ core }) => {
+ // Variables not in the context
+ const refName = process.env.GITHUB_REF_NAME;
+
+ // Compare package.json version's next patch vs. first version patch
+ // A recently opened branch will give the next patch for the previous minor
+ // So, we get the max against the patch 0 of the release branch's version
+ const branchPatch0 = coerce(refName.replace('release-v', '')).version;
+ const packageJsonNextPatch = inc(version, 'patch');
+ const [nextVersion] = rsort([branchPatch0, packageJsonNextPatch], false);
+
+ core.exportVariable('TITLE', `Release v${nextVersion}`);
+};
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/start.sh b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/start.sh
new file mode 100644
index 000000000..7683ec5bc
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/start.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+# Set changeset status location
+# This is needed because `changeset status --output` only works with relative routes
+CHANGESETS_STATUS_JSON="$(realpath --relative-to=. "$RUNNER_TEMP/status.json")"
+
+# Save changeset status to temp file
+npx changeset status --output="$CHANGESETS_STATUS_JSON"
+
+# Defensive assertion. SHOULD NOT BE REACHED
+if [ "$(jq '.releases | length' "$CHANGESETS_STATUS_JSON")" != 1 ]; then
+ echo "::error file=$CHANGESETS_STATUS_JSON::The status doesn't contain only 1 release"
+ exit 1;
+fi;
+
+# Create branch
+BRANCH_SUFFIX="$(jq -r '.releases[0].newVersion | gsub("\\.\\d+$"; "")' $CHANGESETS_STATUS_JSON)"
+RELEASE_BRANCH="release-v$BRANCH_SUFFIX"
+git checkout -b "$RELEASE_BRANCH"
+
+# Output branch
+echo "branch=$RELEASE_BRANCH" >> $GITHUB_OUTPUT
+
+# Enter in prerelease state
+npx changeset pre enter rc
+git add .
+git commit -m "Start release candidate"
+
+# Push branch
+if ! git push origin "$RELEASE_BRANCH"; then
+ echo "::error file=scripts/release/start.sh::Can't push $RELEASE_BRANCH. Did you forget to run this workflow from $RELEASE_BRANCH?"
+ exit 1
+fi
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/state.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/state.js
new file mode 100644
index 000000000..002f7774d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/state.js
@@ -0,0 +1,112 @@
+const { readPreState } = require('@changesets/pre');
+const { default: readChangesets } = require('@changesets/read');
+const { join } = require('path');
+const { fetch } = require('undici');
+const { version, name: packageName } = require(join(__dirname, '../../../contracts/package.json'));
+
+module.exports = async ({ github, context, core }) => {
+ const state = await getState({ github, context, core });
+
+ function setOutput(key, value) {
+ core.info(`State ${key} = ${value}`);
+ core.setOutput(key, value);
+ }
+
+ // Jobs to trigger
+ setOutput('start', shouldRunStart(state));
+ setOutput('promote', shouldRunPromote(state));
+ setOutput('changesets', shouldRunChangesets(state));
+ setOutput('publish', shouldRunPublish(state));
+ setOutput('merge', shouldRunMerge(state));
+
+ // Global Variables
+ setOutput('is_prerelease', state.prerelease);
+};
+
+function shouldRunStart({ isMaster, isWorkflowDispatch, botRun }) {
+ return isMaster && isWorkflowDispatch && !botRun;
+}
+
+function shouldRunPromote({ isReleaseBranch, isWorkflowDispatch, botRun }) {
+ return isReleaseBranch && isWorkflowDispatch && !botRun;
+}
+
+function shouldRunChangesets({ isReleaseBranch, isPush, isWorkflowDispatch, botRun }) {
+ return (isReleaseBranch && isPush) || (isReleaseBranch && isWorkflowDispatch && botRun);
+}
+
+function shouldRunPublish({ isReleaseBranch, isPush, hasPendingChangesets, isPublishedOnNpm }) {
+ return isReleaseBranch && isPush && !hasPendingChangesets && !isPublishedOnNpm;
+}
+
+function shouldRunMerge({
+ isReleaseBranch,
+ isPush,
+ prerelease,
+ isCurrentFinalVersion,
+ hasPendingChangesets,
+ prBackExists,
+}) {
+ return isReleaseBranch && isPush && !prerelease && isCurrentFinalVersion && !hasPendingChangesets && !prBackExists;
+}
+
+async function getState({ github, context, core }) {
+ // Variables not in the context
+ const refName = process.env.GITHUB_REF_NAME;
+ const botRun = process.env.TRIGGERING_ACTOR === 'github-actions[bot]';
+
+ const { changesets, preState } = await readChangesetState();
+
+ // Static vars
+ const state = {
+ refName,
+ hasPendingChangesets: changesets.length > 0,
+ prerelease: preState?.mode === 'pre',
+ isMaster: refName === 'master',
+ isReleaseBranch: refName.startsWith('release-v'),
+ isWorkflowDispatch: context.eventName === 'workflow_dispatch',
+ isPush: context.eventName === 'push',
+ isCurrentFinalVersion: !version.includes('-rc.'),
+ botRun,
+ };
+
+ // Async vars
+ const { data: prs } = await github.rest.pulls.list({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ head: `${context.repo.owner}:merge/${state.refName}`,
+ base: 'master',
+ state: 'open',
+ });
+
+ state.prBackExists = prs.length !== 0;
+
+ state.isPublishedOnNpm = await isPublishedOnNpm(packageName, version);
+
+ // Log every state value in debug mode
+ if (core.isDebug()) for (const [key, value] of Object.entries(state)) core.debug(`${key}: ${value}`);
+
+ return state;
+}
+
+// From https://github.com/changesets/action/blob/v1.4.1/src/readChangesetState.ts
+async function readChangesetState(cwd = process.cwd()) {
+ const preState = await readPreState(cwd);
+ const isInPreMode = preState !== undefined && preState.mode === 'pre';
+
+ let changesets = await readChangesets(cwd);
+
+ if (isInPreMode) {
+ changesets = changesets.filter(x => !preState.changesets.includes(x.id));
+ }
+
+ return {
+ preState: isInPreMode ? preState : undefined,
+ changesets,
+ };
+}
+
+async function isPublishedOnNpm(packageName, version) {
+ const res = await fetch(`https://registry.npmjs.com/${packageName}/${version}`);
+ return res.ok;
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js
new file mode 100644
index 000000000..e156032b1
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js
@@ -0,0 +1,45 @@
+#!/usr/bin/env node
+
+// This script removes the build artifacts of ignored contracts.
+
+const fs = require('fs');
+const path = require('path');
+const match = require('micromatch');
+
+function readJSON(path) {
+ return JSON.parse(fs.readFileSync(path));
+}
+
+const pkgFiles = readJSON('package.json').files;
+
+// Get only negated patterns.
+const ignorePatterns = pkgFiles
+ .filter(pat => pat.startsWith('!'))
+ // Remove the negation part. Makes micromatch usage more intuitive.
+ .map(pat => pat.slice(1));
+
+const ignorePatternsSubtrees = ignorePatterns
+ // Add **/* to ignore all files contained in the directories.
+ .concat(ignorePatterns.map(pat => path.join(pat, '**/*')))
+ .map(p => p.replace(/^\//, ''));
+
+const artifactsDir = 'contracts/build/contracts';
+const buildinfo = 'artifacts/build-info';
+const filenames = fs.readdirSync(buildinfo);
+
+let n = 0;
+
+for (const filename of filenames) {
+ const solcOutput = readJSON(path.join(buildinfo, filename)).output;
+ for (const sourcePath in solcOutput.contracts) {
+ const ignore = match.any(sourcePath, ignorePatternsSubtrees);
+ if (ignore) {
+ for (const contract in solcOutput.contracts[sourcePath]) {
+ fs.unlinkSync(path.join(artifactsDir, contract + '.json'));
+ n += 1;
+ }
+ }
+ }
+}
+
+console.error(`Removed ${n} mock artifacts`);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/solhint-custom/index.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/solhint-custom/index.js
new file mode 100644
index 000000000..9625027ee
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/solhint-custom/index.js
@@ -0,0 +1,84 @@
+const path = require('path');
+const minimatch = require('minimatch');
+
+// Files matching these patterns will be ignored unless a rule has `static global = true`
+const ignore = ['contracts/mocks/**/*', 'test/**/*'];
+
+class Base {
+ constructor(reporter, config, source, fileName) {
+ this.reporter = reporter;
+ this.ignored = this.constructor.global || ignore.some(p => minimatch(path.normalize(fileName), p));
+ this.ruleId = this.constructor.ruleId;
+ if (this.ruleId === undefined) {
+ throw Error('missing ruleId static property');
+ }
+ }
+
+ error(node, message) {
+ if (!this.ignored) {
+ this.reporter.error(node, this.ruleId, message);
+ }
+ }
+}
+
+module.exports = [
+ class extends Base {
+ static ruleId = 'interface-names';
+
+ ContractDefinition(node) {
+ if (node.kind === 'interface' && !/^I[A-Z]/.test(node.name)) {
+ this.error(node, 'Interface names should have a capital I prefix');
+ }
+ }
+ },
+
+ class extends Base {
+ static ruleId = 'private-variables';
+
+ VariableDeclaration(node) {
+ const constantOrImmutable = node.isDeclaredConst || node.isImmutable;
+ if (node.isStateVar && !constantOrImmutable && node.visibility !== 'private') {
+ this.error(node, 'State variables must be private');
+ }
+ }
+ },
+
+ class extends Base {
+ static ruleId = 'leading-underscore';
+
+ VariableDeclaration(node) {
+ if (node.isDeclaredConst) {
+ // TODO: expand visibility and fix
+ if (node.visibility === 'private' && /^_/.test(node.name)) {
+ this.error(node, 'Constant variables should not have leading underscore');
+ }
+ } else if (node.visibility === 'private' && !/^_/.test(node.name)) {
+ this.error(node, 'Non-constant private variables must have leading underscore');
+ }
+ }
+
+ FunctionDefinition(node) {
+ if (node.visibility === 'private' || (node.visibility === 'internal' && node.parent.kind !== 'library')) {
+ if (!/^_/.test(node.name)) {
+ this.error(node, 'Private and internal functions must have leading underscore');
+ }
+ }
+ if (node.visibility === 'internal' && node.parent.kind === 'library') {
+ if (/^_/.test(node.name)) {
+ this.error(node, 'Library internal functions should not have leading underscore');
+ }
+ }
+ }
+ },
+
+ // TODO: re-enable and fix
+ // class extends Base {
+ // static ruleId = 'no-external-virtual';
+ //
+ // FunctionDefinition(node) {
+ // if (node.visibility == 'external' && node.isVirtual) {
+ // this.error(node, 'Functions should not be external and virtual');
+ // }
+ // }
+ // },
+];
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/solhint-custom/package.json b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/solhint-custom/package.json
new file mode 100644
index 000000000..075eb929d
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/solhint-custom/package.json
@@ -0,0 +1,5 @@
+{
+ "name": "solhint-plugin-openzeppelin",
+ "version": "0.0.0",
+ "private": true
+}
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/update-docs-branch.js b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/update-docs-branch.js
new file mode 100644
index 000000000..cf61daad8
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/update-docs-branch.js
@@ -0,0 +1,65 @@
+const proc = require('child_process');
+const read = cmd => proc.execSync(cmd, { encoding: 'utf8' }).trim();
+const run = cmd => {
+ proc.execSync(cmd, { stdio: 'inherit' });
+};
+const tryRead = cmd => {
+ try {
+ return read(cmd);
+ } catch {
+ return undefined;
+ }
+};
+
+const releaseBranchRegex = /^release-v(?(?\d+)\.(?\d+)(?:\.(?\d+))?)$/;
+
+const currentBranch = read('git rev-parse --abbrev-ref HEAD');
+const match = currentBranch.match(releaseBranchRegex);
+
+if (!match) {
+ console.error('Not currently on a release branch');
+ process.exit(1);
+}
+
+const pkgVersion = require('../package.json').version;
+
+if (pkgVersion.includes('-') && !pkgVersion.includes('.0.0-')) {
+ console.error('Refusing to update docs: non-major prerelease detected');
+ process.exit(0);
+}
+
+const current = match.groups;
+const docsBranch = `docs-v${current.major}.x`;
+
+// Fetch remotes and find the docs branch if it exists
+run('git fetch --all --no-tags');
+const matchingDocsBranches = tryRead(`git rev-parse --glob='*/${docsBranch}'`);
+
+if (!matchingDocsBranches) {
+ // Create the branch
+ run(`git checkout --orphan ${docsBranch}`);
+} else {
+ const [publishedRef, ...others] = new Set(matchingDocsBranches.split('\n'));
+ if (others.length > 0) {
+ console.error(
+ `Found conflicting ${docsBranch} branches.\n` +
+ 'Either local branch is outdated or there are multiple matching remote branches.',
+ );
+ process.exit(1);
+ }
+ const publishedVersion = JSON.parse(read(`git show ${publishedRef}:package.json`)).version;
+ const publishedMinor = publishedVersion.match(/\d+\.(?\d+)\.\d+/).groups.minor;
+ if (current.minor < publishedMinor) {
+ console.error('Refusing to update docs: newer version is published');
+ process.exit(0);
+ }
+
+ run('git checkout --quiet --detach');
+ run(`git reset --soft ${publishedRef}`);
+ run(`git checkout ${docsBranch}`);
+}
+
+run('npm run prepare-docs');
+run('git add -f docs'); // --force needed because generated docs files are gitignored
+run('git commit -m "Update docs"');
+run(`git checkout ${currentBranch}`);
diff --git a/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/README.md b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/README.md
new file mode 100644
index 000000000..2309f9e10
--- /dev/null
+++ b/lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/README.md
@@ -0,0 +1,21 @@
+The upgradeable variant of OpenZeppelin Contracts is automatically generated from the original Solidity code. We call this process "transpilation" and it is implemented by our [Upgradeability Transpiler](https://github.com/OpenZeppelin/openzeppelin-transpiler/).
+
+When the `master` branch or `release-v*` branches are updated, the code is transpiled and pushed to [OpenZeppelin/openzeppelin-contracts-upgradeable](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable) by the `upgradeable.yml` workflow.
+
+## `transpile.sh`
+
+Applies patches and invokes the transpiler with the command line flags we need for our requirements (for example, excluding certain files).
+
+## `transpile-onto.sh`
+
+```
+bash scripts/upgradeable/transpile-onto.sh []
+```
+
+Transpiles the contents of the current git branch and commits the result as a new commit on branch ``. If branch `